我有一些“全局”构造,这些构造用new分配,并且在整个应用程序生命周期内都是活着的。
在应用程序完成之前,我是否应该在指针上调用delete? 无论如何,所有的应用程序内存在关闭后都不会被回收吗?
编辑清晰度。我只是在谈论不会为程序关闭时“死”的生命对象调用delete。
答案 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)任何其他“特殊情况”,其中必须将对象的销毁留给操作系统。
有很多'特殊情况'我认为'清理'关机代码是特殊情况。