必须在C ++中删除动态分配的内存?

时间:2014-03-11 02:31:00

标签: c++ dynamic-allocation

说我的程序中有list<TreeNode>。每次我使用new动态分配TreeNode类并将其附加到列表中;当程序结束时,列表消失了。但是,我不确定附加到它的所有元素是否会在列表消失时自动删除。我是否仍需要查看列表并delete我自己的所有元素?

此外,内存泄漏会造成什么损害?当一个进程结束时,我认为它的内存空间将被释放,因此实际上没有任何东西会损坏我的计算机。

3 个答案:

答案 0 :(得分:2)

现在,你的list<TreeNode>会因为程序已经终止而自行销毁,但是现在让我们假设您正在使用在循环中创建和销毁的本地list<TreeNode>对象的情况类似。现在,内存泄漏变成了你必须担心的事情。

底线是您的代码不应泄漏,无论情况如何。唯一的例外可能是单例或类似模式,其中可能有一些理由让对象“死而不清理”。但是对于像列表类这样的东西,绝对不应该存在泄漏。

此外,如果该过程不应该关闭怎么办?如果它是一个必须每天24小时运行的关键任务应用程序怎么办?这个泄漏现在变成了一场灾难 - 你或那个(现在生气的)同事将在半夜接到电话,试图重新启动系统,因为资源耗尽。

答案 1 :(得分:1)

如果TreeNode占用的事物是内存,则退出程序时无需释放它们。但是,如果它包含缓冲的写入文件流,并且您没有释放它,则缓冲区中可能仍有数据无法写入磁盘。然后你会有数据丢失。 : - )

P.S。我需要补充一点,这个允许操作系统免费为您提供服务的策略仅适用于您的程序是短暂的,并且您没有“垃圾”对象(即,您需要在程序的生命周期内保留对所有已创建对象的引用) 。如果它是长寿的(但你没有垃圾对象),只需使用静态内存,不要做任何动态分配。如果您有垃圾对象,则需要释放它们。无话可问。 : - )

答案 2 :(得分:0)

如果您每次将new对象添加到列表中时都使用TreeNode来分配delete对象,那么您在{{{{}之前必须list该对象。 1}}被清除。

一个新=一个删除