如果 set_terminate 中的处理程序没有中止,会发生什么情况?
What happens if the handler in set_terminate does not abort?
如果用 set_terminate 指示的处理程序本身不调用 abort(),程序的行为是什么?
如果我理解得很好, std::terminate() (在 header 异常中)被调用,例如,当没有捕获到异常时。我 read (also here) std::terminate() 默认定义为对 std::abort() 的调用,但可以使用 set_terminate(handler) 进行修改。 如果新处理程序不调用 abort() 怎么办?是默认添加的吗?
我在下面说明我不理解的行为。收到一条短消息后,terminate() 的新处理程序可以中止、调用终止或退出。如果设置了这些选项中的none,程序将异常终止。但是如果插入 abort() 也会发生同样的事情。如果我们使用 exit(),程序以成功结束,错误代码写在 exit(..) 中。如果我们调用 terminate(),我们将进入无限循环(运行 失败,代码 127)。
这是在装有 NetBeans 的 Windows 8.1 计算机上使用 MinGW 6.3.0。
void myOwnOnExit() {
cerr << "called myOwnOnExit\n";
}
void myOwnTerminate() {
cerr << "called myOwnTerminate\n";
// 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
内终止程序,这是标准要求:
Required behavior: A terminate_handler shall terminate execution of the program without returning to the caller.
因此,如果您的处理程序未能满足要求,则为未定义行为。
如果用 set_terminate 指示的处理程序本身不调用 abort(),程序的行为是什么?
如果我理解得很好, std::terminate() (在 header 异常中)被调用,例如,当没有捕获到异常时。我 read (also here) std::terminate() 默认定义为对 std::abort() 的调用,但可以使用 set_terminate(handler) 进行修改。 如果新处理程序不调用 abort() 怎么办?是默认添加的吗?
我在下面说明我不理解的行为。收到一条短消息后,terminate() 的新处理程序可以中止、调用终止或退出。如果设置了这些选项中的none,程序将异常终止。但是如果插入 abort() 也会发生同样的事情。如果我们使用 exit(),程序以成功结束,错误代码写在 exit(..) 中。如果我们调用 terminate(),我们将进入无限循环(运行 失败,代码 127)。
这是在装有 NetBeans 的 Windows 8.1 计算机上使用 MinGW 6.3.0。
void myOwnOnExit() {
cerr << "called myOwnOnExit\n";
}
void myOwnTerminate() {
cerr << "called myOwnTerminate\n";
// 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
内终止程序,这是标准要求:
Required behavior: A terminate_handler shall terminate execution of the program without returning to the caller.
因此,如果您的处理程序未能满足要求,则为未定义行为。