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销毁给定对象的最后一个实例时,也会销毁引用的对象并回收其内存.这避免了许多与手动内存管理相关的陷阱.