当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么托管语言不能提供手动删除对象的功能?》经验,为你挑选了1个好方法。

假设您想编写一个处理大型数据集的高性能方法.为什么开发人员不能开启手动内存管理而不是被迫转向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是有效的表达式.



1> Pavel Minaev..:

因为允许您手动删除内存块,而可能仍然有引用(并且运行时无法知道没有执行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是有效的表达式.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有