调用exit()时是否运行析构函数?

Wil*_*mKF 28 c++ destructor exit

可能重复:
exit()或异常会阻止调用范围结构析构函数吗?

在C++中,当应用程序调用exit(3)时,堆栈上的析构函数应该运行以展开堆栈吗?

Che*_*Alf 41

不,大多数析构函数都没有运行exit().

C++98§18.3/ 8讨论了这一点.

实质上,当exit被调用时,静态对象被销毁,atexit处理程序被执行,打开的C流被刷新和关闭,并且创建的文件tmpfile被删除.本地自动对象不会被破坏.即,没有堆栈放松.

呼叫abort让更少的事情发生:没有任何清理.

  • 对于不希望发生清理的人来说,_exit() 可能是比 abort() 更好的调用,因为 abort 会引发 SIGABRT 信号,通常会导致与崩溃非常相似的行为。 (2认同)

Bar*_*own 6

如果您的操作系统是合理的(Unix,Linux或最近的Windows),调用exit()会告诉内核取消分配所有进程的内存.堆栈不需要解开; 它将永远不复存在.

  • 并且不会调用堆栈析构函数中的任何RAII代码.如果只处理流程私有的内存,那可能无关紧要; 但是,如果它涉及(a)需要删除或重命名或以其他方式清理的文件,以及(b)共享内存中进程之间共享的数据结构的完整性,则更为重要.//由于这些原因,一些项目禁止使用exit,和/或重新定义exit()以抛出将导致堆栈展开的异常. (20认同)