c ++我应该删除指向应用程序生命周期变量的指针吗?

时间:2011-12-21 10:42:55

标签: c++ memory

我有一些“全局”构造,这些构造用new分配,并且在整个应用程序生命周期内都是活着的。

在应用程序完成之前,我是否应该在指针上调用delete? 无论如何,所有的应用程序内存在关闭后都不会被回收吗?

编辑清晰度。我只是在谈论不会为程序关闭时“死”的生命对象调用delete。

7 个答案:

答案 0 :(得分:25)

从技术上讲,是的,内存被回收了。但除非您使用delete,否则不会运行这些对象的析构函数,并且不会应用它们的副作用。这可能导致临时文件未被删除或数据库更改未提交,具体取决于这些析构函数的用途。

也不要忘记墨菲。现在,在您描述时使用管理这些对象的代码(对象必须在程序的生命周期内持久存在),但稍后您可能希望重用代码以使其多次运行。除非它可以正确地处理重新创建对象,否则它将泄漏对象。

答案 1 :(得分:2)

清理所有内容总是很好的做法,虽然内存被重新填充,但这些对象可能还有其他资源(共享内存,污点等)应该被清理,可能是对象析构函数。

如果您不想调用delete,请使用共享指针来保存这些资源,以便在应用程序退出时正确清理它们。

您如何测试您的申请?不清理可能会阻碍一个体面的测试工具的开发。应用程序的测试可能需要一种欺骗关闭和重启的方法。

清理那个简单的释放记忆还有很多。

答案 2 :(得分:1)

我认为你可能是对的,但我个人认为依赖系统会导致编码不好和做法不好,并确保我的代码在关闭时始终能够正常整理。

答案 3 :(得分:1)

没有一个正确的答案。大多数时候,它可能没有 但是,除了之外,还有一些破坏者会做一些重要的事情 只是释放内存(我有一个删除临时文件),其中 支持清理;另一方面,破坏这些物体 如果对象被使用,可能导致破坏问题的顺序 其他对象的析构函数。我的一般规则是不破坏, 除非析构函数做的不仅仅是释放内存,而且 其他人可能更喜欢一组不同的默认值。

答案 4 :(得分:1)

不,不要编写/调试/维护代码来执行操作系统已经非常擅长的操作。

除非有相反的具体原因,(例如,要提交的未完成事务,要刷新的文件,要关闭的连接),我不打算编写代码来执行操作系统将要执行的操作。如果dtor没有什么特别的,为什么还要打电话呢?

许多开发人员花了很多精力在应用程序关闭时删除/销毁/释放/终止内容 - 为了避免从内存管理器关闭应用程序关闭时出现一些虚假的“泄漏报告”破坏。

答案 5 :(得分:0)

除了没有执行析构函数(如sharptooth pointer out)之外,删除全局对象以使内存检查器满意也是值得的。特别是如果您的代码位于共享库中 - 您不希望因为没有正确删除而使其内存检查器(例如,Valgrind)输出混乱。

答案 6 :(得分:0)

..然后就是那些在操作系统终止进程之前你绝对不希望调用dtor的情况,例如:

1)当dtor因为试图终止线程而无法正常工作,失败并阻塞线程句柄或其他信号时(常年'加入/等待'死锁) - 导致99%的家庭失业'我的应用程序不会干净地关闭'帖子。

2)当dtor无法正常工作时,因为它无论如何都是坏的并埋在图书馆里。

3)如果内存必须比其他进程线程更长,那么关闭时会出现segfaults / AV(例如,线程可能在关闭时写入的缓冲区对象池)。

4)任何其他“特殊情况”,其中必须将对象的销毁留给操作系统。

有很多'特殊情况'我认为'清理'关机代码是特殊情况。