【问题标题】:Are destructors run when calling exit()? [duplicate]调用 exit() 时会运行析构函数吗? [复制]
【发布时间】:2011-10-26 15:35:01
【问题描述】:

可能重复:
Will exit() or an exception prevent an end-of-scope destructor from being called?

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

【问题讨论】:

  • 还有,还有其他方法吗? throw 一个特殊的类型,而不是调用exit,在main 中捕获它,然后从main 中捕获它的return 而不是从main 中的exit
  • @AaronMcDaid 我不明白你的问题。替代方法是什么?通过避免调用exit(),您会尝试完成什么?在我的一个应用程序中,我确实抛出了一个 customExit 对象并在 main 中捕获它并使用来自 customExit 对象的整数值来提供来自 main 的返回值,这样我的 RAII 析构函数就会运行以清理诸如临时文件。
  • 您的评论准确地回答了我(写得不好)的问题。谢谢!基本上,我想确认其他人使用这种throw 方法来确保在正常的程序退出中一切都被破坏

标签: c++ destructor exit


【解决方案1】:

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

【讨论】:

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

不,大多数析构函数不在exit() 上运行。

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

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

调用 abort 让事情变得更少:没有任何清理。

【讨论】:

  • 对于不希望发生清理的人来说,_exit() 可能是比 abort() 更好的调用,因为 abort 会引发 SIGABRT 信号,通常会导致与崩溃非常相似的行为。跨度>
猜你喜欢
  • 2012-11-28
  • 2012-09-02
  • 2011-02-09
  • 2018-09-15
  • 2017-02-08
  • 2013-04-17
  • 1970-01-01
  • 2016-07-05
  • 2016-01-23
相关资源
最近更新 更多