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