C++内存管理和.NET内存管理有什么区别?

Ram*_*Ram 2 .net c# c++

C++内存管理和.NET内存管理有什么区别?

Ant*_*ams 15

在C++中,您既可以分配具有静态存储的对象,也可以将它们放在整个程序中,当它们是函数本地时将它们分配到堆栈上(在这种情况下,当包含块退出时它们会被销毁),或者在它们上面分配它们.堆(在这种情况下,只有通过显式调用适当的解除分配函数才能销毁它们).堆内存被分配为原始内存,与之一起malloc释放free,或者分配并构造成一个对象new,然后将对象销毁并释放内存delete.

C#提供了无限内存的幻觉---你不能显式释放内存,只能分配内存并构造一个对象new.相反,GC会为您无法再访问的对象回收内存,以便可以将其重新用于新对象.

在C++中,类析构函数在对象被销毁时运行.这为每个对象提供了释放任何相关资源的机会,无论它们是更多对象,还是外部资源(如文件句柄或数据库句柄).

在C#中,您必须通过调用释放函数来显式管理非内存资源的释放.该using工具允许您让编译器Dispose()自动为您调用,但这仍然与对象生存期分开---当GC系统决定(可能永远不会)时,将回收对象的内存.

在C++中,像std::shared_ptr(或boost::shared_ptr使用较旧的编译器)这样的工具允许您通过引用计数对象将破坏堆对象的责任传递给C++运行时.当shared_ptr销毁给定对象的最后一个实例时,也会销毁引用的对象并回收其内存.这避免了许多与手动内存管理相关的陷阱.

  • 在C++中,你不应该使用`malloc()`/`free()`,但是这是一个很好的总结."+ 1"来自我. (7认同)

sbi*_*sbi 5

在.NET中,内存被视为与所有其他资源不同:虽然您必须负责释放所需的所有资源,但您不必担心内存.

在C++中,您必须注意释放您使用的所有资源,包括动态分配的内存.但是,C++使用了许多工具和技术(即基于自动作用域的分配/释放和RAII)来帮助您.在编写C++代码的十年中,我很少(阅读:平均每年不到一次)手动释放内存,如果是这样,它就在RAII句柄类中.