如果set_terminate中的处理程序不会流产,会发生什么

What happens if the handler in set_terminate does not abort?

本文关键字:什么 程序 set terminate 处理 如果      更新时间:2023-10-16

如果用set_terninate指示的处理程序本身不调用abort((?

,程序的行为是什么?

如果我很好地理解,std :: terminate(((在标题异常(被调用,例如,当未捕获异常时。我读(也在这里(,默认情况下将std :: terminate((定义为呼叫std :: abort((,但可以使用set_terninate(handler(进行修改。如果新处理程序不调用Abort((怎么办?默认情况下是否添加?

我在下面说明了我不理解的行为。短信后,终止((的新处理程序可以中止或呼叫终止或退出。如果未设置这些选项,则程序以异常终止结束。但是,如果插入Abort((,也会发生同样的事情。如果我们使用exit((,则程序以成功结束,并且在出口(..(中编写的错误代码结束。如果我们调用terminate((,我们将获得无尽的循环(运行失败,代码127(。

这是Windows 8.1计算机上的MingW 6.3.0,带Netbeans。

void myOwnOnExit() {
  cerr << "called myOwnOnExitn";
}
void myOwnTerminate() {
  cerr << "called myOwnTerminaten";
  // Uncomment one of the following:
  // // if none is uncommented, abnormal termination, error 3
  // abort();      // with or without it, abnormal termination, error 3
  // terminate();  // get an infinite loop, error code 127 in 3 seconds
  // exit(EXIT_SUCCESS); // displays "called myOwnOnExit", success 
}
int main() {
  atexit(myOwnOnExit);
  set_terminate(myOwnTerminate);
  throw 1;
  cerr << "we should not see this"; // and we don't
}

非常感谢您的提示或建议。

您应该在 terminate_handler中终止程序,这是标准要求的:

[terminate.handler]

必需的行为:终止_handler应终止程序执行,而无需返回呼叫者。

因此,如果您的处理程序无法满足要求,那是不确定的行为。