保证在突然终止或退出时在C++中调用函数

NoN*_*ame 6 c++ exception-handling

保证在突然终止或退出期间调用C++中的哪个函数可以执行清理活动.

zwo*_*wol 8

根据"突然终止"的含义,有几种不同的选择:

  • 全局析构函数将在正常终止时返回(返回main或调用exit()).
  • atexit() 在正常终止时注册要调用的函数.
  • std::set_terminate 注册一个函数,当抛出异常但未被捕获时,或者"由于某些其他原因必须终止异常处理"时将调用该函数.
  • sigaction()寄存器在程序接收信号时调用的函数,其中许多函数通常会突然终止程序.当程序处于内部不一致状态时,可以调用信号处理程序,因此它们可以做的事情非常有限.例如,他们不能做任何可能分配内存的事情.此外,此API在Windows上不可用; 有等价物,但我不熟悉它们.

请注意,所有常用的操作系统至少提供一种突然终止程序的方法,这种方法无法从代码中截取.例如,Unix有信号9(SIGKILL),您无法为其注册处理程序. 这是一个功能,而不是一个bug. 你,用户,需要一种方法来使一个过程消失,即使它已经尽其所能使其自身坚不可摧.此外,当用户的宠物兔子通过计算机上的电源线啃咬时,没有代码可以保护您的过程.因此,可能更好地利用您的时间来设计程序以干净地恢复崩溃,而不是在崩溃发生时尝试清理.有关详细信息,请参阅有关" 仅崩溃设计 "的文章.


lit*_*adv 2

阅读atexit 此处但是,并非在所有情况下都会调用它(例如,调用abort不会触发您注册的函数atexit)。

您可以实现自己的信号处理程序,然后所有信号都将传递到那里,您可以对每个信号执行任何操作。