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

时间:2010-08-23 06:45:39

标签: c# .net c++

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

4 个答案:

答案 0 :(得分:15)

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

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

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

在C#中,担心的事情要少得多。

当你想在C#中使用一个对象时,你可以简单地创建它;一旦你完成它,你不必做任何其他事情。当后台工作人员(垃圾收集器)意识到您不再使用它时,它将在后台清理它。

在vanilla C ++中,没有运行任何后台进程来清理内存。这意味着,只要您手动分配内存(很多时候),您就有责任在完成使用后将其删除。还必须注意确保不要删除相同的东西两次。

关于C#方面的注意事项:这并不意味着你可以完全忽略内存的工作原理。了解幕后发生的事情非常有帮助。但总的来说,你不必担心它。

编辑:正如GMan在下面所说的那样(如果我正确理解他),您可以通过让每个分配都限定范围来处理C ++中的内存管理,因此C ++环境将考虑分配并删除你。从这个意义上说,你必须再次理解C ++如何分配和删除以免遇到麻烦。

答案 3 :(得分:0)

一些c ++开源选择创建自己的内存垃圾收集器,如V8 javascript引擎,以避免内存泄漏的所有问题。

相关问题