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

use*_*509 10 c++ memory

我有一些"全局"构造,分配了新的,并且在整个应用程序生命周期中都是活跃的.

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

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

sha*_*oth 25

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

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


Mar*_*mes 1

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

除非有相反的具体原因(例如,要提交的未完成事务、要刷新的文件、要关闭的连接),否则我不会编写代码来执行操作系统无论如何都会执行的操作。如果 dtor 没有做任何特别的事情,为什么还要调用它呢?

许多开发人员投入了大量精力来在应用程序关闭时删除/销毁/释放/终止内容 - 付出大量努力以避免来自内存管理器的应用程序关闭时出现一些虚假的“泄漏报告”,而内存管理器本身即将被销毁。

  • 这难以置信。如何选择 0 票赞成的答案而不是 9 票赞成的[正确]答案?马丁,你的方法的问题在于它需要太多的知识。也就是说,您必须*了解每种情况*析构函数是否“做了一些特殊的事情”。养成始终正确编写代码的习惯会更好,那么析构函数如何编写并不重要。如果您在调用库代码时甚至无法知道析构函数的作用,则尤其如此。 (7认同)
  • 一般的教训是,这不是让代码易于“编写”,而是让代码易于“维护”! (4认同)
  • 如果您不清理并删除“虚假”泄漏报告,您将如何确定哪些泄漏报告不是“虚假”? (2认同)