假设您想编写一个处理大型数据集的高性能方法。
为什么开发人员不应该能够打开手动内存管理而不是被迫迁移到 C 或 C++?
void Process()
{
unmanaged
{
Byte[] buffer;
while (true)
{
buffer = new Byte[1024000000];
// process
delete buffer;
}
}
}
最佳答案
因为允许您手动删除一个内存块,同时可能仍然存在对它的引用(并且运行时无法知道不执行 GC 循环)会产生悬空指针,从而破坏 memory safety . GC 语言通常在设计上是内存安全的。
也就是说,特别是在 C# 中,你可以做你想做的事:
void Process()
{
unsafe
{
byte* buffer;
while (true)
{
buffer = Marshal.AllocHGlobal(1024000000);
// process
Marshal.FreeHGlobal(buffer);
}
}
}
请注意,与在 C/C++ 中一样,C# 中的原始指针类型具有完整的指针算术 - 所以
buffer[i]
或 buffer+i
是有效的表达式。
关于language-agnostic - 为什么托管语言不提供手动删除对象的能力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868604/