当程序退出时,是否有理由在C ++中调用delete?
在我的C ++ main
函数中,例如,如果我有一个指向使用堆内存(而不是堆栈内存)的variables的指针 – 这是我的应用程序退出后自动释放? 我会这样认为的。
即使如此,即使您认为在退出时自动释放内存的情况下永远不会使用堆分配,也是一种很好的做法吗?
例如,有没有这样做的意义?
int main(...) { A* a = new A(); a->DoSomething(); delete a; return 0; }
我在想也许万一我重构(或其他人重构)的代码,并将其放在应用程序的其他地方,其中delete
是真的neccecary。
除了Brian R. Bondy(专门讨论C ++中的含义)的答案外 ,Paul Tomblin 对C特定的问题也有很好的回答,这个问题也谈到了C ++析构函数。
显式调用delete是很重要的,因为在析构函数中可能有一些代码需要执行。 就像也许写一些数据到一个日志文件。 如果你让操作系统释放你的内存,你的析构函数中的代码将不会被执行。
当程序结束时,大多数操作系统都会释放内存。 但是这是一个很好的做法,自己释放它,就像我上面说的操作系统不会调用你的析构函数。
至于一般的调用delete,是的,你总是要调用delete,否则你的程序中会出现内存泄漏,这将导致新的分配失败。
是的,当您通过内存泄漏检测工具运行程序时,有助于消除误报。
是。
- 该标准不保证操作系统将清理内存。 你可以期望在主stream平台上这个,但为什么要抓住机会呢?
- 如果你不故意泄漏内存,你可以最小化像valgrind这样的工具报告的混乱。
- 如果你有这个习惯,谁能说有一天你不会有意外的把这个方法应用到什么地方呢?
- 你可能需要破坏对象。 通常只是假设你这样做。 它并不伤害你。
考虑要删除的对象获取操作系统无法安全释放的外部资源的情况。 如果您不调用该对象的删除,则会发生实际泄漏。
想想你的A
级必须破坏。
如果你不调用delete
a
,这个析构函数将不会被调用。 通常情况下,这个过程无论如何都是无关紧要的。 但是如果析构函数必须释放数据库中的对象呢? 刷新caching到日志文件? 写一个内存caching回磁盘?
你看,删除对象不仅仅是“好的做法”,在某些情况下它是必需的。
明确删除对象的另一个原因是,如果你的应用程序有一个真正的内存泄漏,使用valgrind这样的工具就可以更容易地find泄漏,如果你不必筛选不需要清理的“泄漏”。
另一个删除的原因是为了避免将来可能使用的泄漏检测器的误报。 如果您有误报,您可能不会注意到泄漏检测仪报告的真实泄漏 – 它将被埋在报告中的虚假泄漏之中。
一定要确保你自己删除它。 操作系统会照顾到这一点,但排除可以轻易避免的错误