为什么托管语言不能提供手动删除对象的功能?

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是有效的表达式.