language-agnostic - 为什么托管语言不提供手动删除对象的能力?

标签 language-agnostic memory-management garbage-collection managed-code

假设您想编写一个处理大型数据集的高性能方法。
为什么开发人员不应该能够打开手动内存管理而不是被迫迁移到 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/

相关文章:

memory-management - 为什么我们不应该在嵌入式系统中动态分配不同大小的内存

.net - GC 需要多长时间?

language-agnostic - 没有共同点的类的接口(interface)

language-agnostic - 什么是存在类型?

algorithm - 每组给定大小的大量数字的中位数

language-agnostic - 如何计算球体上点到线段的距离?

c# - CLR:常量字符串值在内存中的生命周期是多长?

C 如何释放多维动态结构中的动态字符串?

c++ - 垃圾收集 C 会比 C++ 更快吗?

c# - 此代码会导致托管堆损坏吗?