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

c++ should i bother deleting pointers to application lifetime variables?

本文关键字:变量 周期 指针 生命 应用程序 c++ 删除 我应该      更新时间:2023-10-16

我有一些"全局"结构,它们被分配为new,并且在整个应用程序生命周期中都是活跃的。

我应该在应用程序结束之前对指针调用delete吗?难道不是所有的应用程序的内存被回收后,它关闭?

编辑清晰。我只是在谈论不要对那些在程序关闭时"死亡"的生命周期对象调用delete。

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

也别忘了墨菲。现在,用于管理这些对象的代码按照您的描述使用(对象必须在程序的生命周期中持续存在),但稍后您可能希望重用这些代码,以便多次运行。除非它能够正确地重新创建对象,否则它将会泄漏对象。

清理所有内容总是好的做法,尽管内存被回收,但这些对象可能分配了其他资源(共享内存,smeaphores等),这些资源应该被清理,可能是由对象的析构函数。

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

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

不,不要编写/调试/维护代码来做操作系统已经很擅长的事情。

除非有相反的具体原因,(例如……)待提交的未完成事务,待刷新的文件,待关闭的连接),我不会费心写代码去做操作系统无论如何都会做的事情。如果医生不做什么特别的事,为什么还要打电话呢?

许多开发人员在应用程序关闭时投入了大量精力来删除/销毁/释放/终止内容-这是为了避免在应用程序关闭时从内存管理器中产生一些虚假的"泄漏报告",而内存管理器本身即将被销毁。

我认为你可能是对的,但我个人认为依赖系统是糟糕的编码和糟糕的做法,并确保我的代码在关闭时总是正确整理。

没有唯一的正确答案。大多数时候,它可能不会物质,但是有析构函数做一些重要的事情只是释放内存(我有一个删除临时文件),这主张清理;另一方面,销毁这样的对象可能导致销毁顺序问题,如果对象被使用其他对象的析构函数。我的基本原则是不破坏,除非析构函数做的不仅仅是释放内存,但是其他人可能更喜欢不同的默认设置。

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

…还有一些情况,你绝对不希望在操作系统终止进程之前调用医生,例如:

1)当医生不能正常工作,因为它试图终止一个线程,失败和阻塞线程句柄或其他信号,(常年'join/waitFor'死锁)-导致99%的家庭'我的应用程序不会干净地关闭'帖子。

2)当医生不能正常工作时,因为它只是坏了,埋在图书馆里。

3)内存必须比进程线程活得长,否则在关闭时将出现段错误/AV,(例如。(线程在关闭时可能正在写入的缓冲区对象池)。

4)任何其他必须留给操作系统销毁对象/s的"特殊情况"。

有太多的"特殊情况",我把"清理"关机代码作为特殊情况。