假设您想编写一个处理大型数据集的高性能方法.为什么开发人员不能开启手动内存管理而不是被迫转向C或C++?
void Process() { unmanaged { Byte[] buffer; while (true) { buffer = new Byte[1024000000]; // process delete buffer; } } }
Pavel Minaev.. 13
因为允许您手动删除内存块,而可能仍然有引用(并且运行时无法知道没有执行GC循环)会产生悬空指针,从而破坏内存安全性.GC语言通常在设计上是内存安全的.
也就是说,特别是在C#中,你可以做你想做的事情:
void Process() { unsafe { byte* buffer; while (true) { buffer = Marshal.AllocHGlobal(1024000000); // process Marshal.FreeHGlobal(buffer); } } }
请注意,与在C/C++中一样,您对C#中的原始指针类型有完整的指针算法 - 所以buffer[i]
或者buffer+i
是有效的表达式.
因为允许您手动删除内存块,而可能仍然有引用(并且运行时无法知道没有执行GC循环)会产生悬空指针,从而破坏内存安全性.GC语言通常在设计上是内存安全的.
也就是说,特别是在C#中,你可以做你想做的事情:
void Process() { unsafe { byte* buffer; while (true) { buffer = Marshal.AllocHGlobal(1024000000); // process Marshal.FreeHGlobal(buffer); } } }
请注意,与在C/C++中一样,您对C#中的原始指针类型有完整的指针算法 - 所以buffer[i]
或者buffer+i
是有效的表达式.