为什么在程序终止时调用析构函数很重要?

时间:2010-09-04 06:45:44

标签: c++

如果您查看此链接http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=107 它是写的:

  

“例如,abort()和exit()库函数永远不会在面向对象的环境中使用 - 即使在调试期间 - 因为它们在程序终止之前不会调用对象的析构函数。”

为什么在调用exit时需要调用析构函数? (因为操作系统保证只要程序退出就会回收内存,对吗?)

2 个答案:

答案 0 :(得分:9)

除了释放内存和/或资源之外,析构函数可以并且经常执行其他操作。它们通常用于使某些其他保证,例如用户数据写入文件或非过程特定资源处于已知状态。操作系统不会在退出时执行这些类型的操作。

话虽如此,任何依赖这些行为的程序都存在根本缺陷。使用exit和abort不是避免析构函数的唯一方法。还有许多其他方法可以绕过析构函数。例如,用户强制终止进程或停电。

我绝对不同意在引用的段落中使用 never 。我至少可以想到一种你绝对不希望析构函数执行的情况:内存损坏。在您检测到损坏的内存时,您无法再对进程中的代码做出任何保证,包括析构函数。应该将数据写入文件的代码可能会删除/损坏它。

检测到内存损坏时唯一安全的做法是尽快退出进程。

答案 1 :(得分:0)

首先,我想建议“不要盲目相信你读过的东西。” 可能正如JaredPar所说,析构函数可能会做一些日志记录并关闭OS资源处理事情。如果你打电话给中止或退出,这些事情永远不会发生。

但我当然不同意这句话。中止是在开发周期中查找编程错误的最佳和最快的方法。作为开发人员,你肯定不会在代码中盲目地中止,但在你知道应该从未发生的情况下。当你知道另一个程序员或者你在代码中的某个地方弄乱了并且最好停止而不是处理错误时,你就放弃了。我已经经历了一个中止已经真正保存了@ $$的情况。