命名空间
变体
操作

std::terminate

来自 cppreference.com
< cpp‎ | error
在头文件 <exception> 中定义
void terminate();
(C++11之前)
[[noreturn]] void terminate() noexcept;
(C++11之后)

std::terminate() 在以下任何情况下由 C++ 运行时调用:

1) 抛出异常 但未被捕获(在这种情况下,是否进行任何堆栈展开是实现定义的)。
2) 在处理尚未捕获的异常时,由异常处理机制直接调用的函数通过异常退出(例如,一些局部对象的析构函数或构造捕获子句参数的复制构造函数)。
3) 静态 或线程局部(C++11之后) 对象的构造函数或析构函数抛出异常。
4)std::atexit std::at_quick_exit(C++11之后) 注册的函数抛出异常。
5) 违反 动态异常说明,并且 std::unexpected 的默认处理程序被执行。
6) std::unexpected 的非默认处理程序抛出违反先前违反的动态异常说明的异常,如果说明不包括 std::bad_exception
(C++17之前)
7) 违反 noexcept 说明(在这种情况下,是否进行任何堆栈展开是实现定义的)。
8) std::nested_exception::rethrow_nested 被调用,但对象并未保存捕获的异常。
9)std::thread 的初始函数抛出异常。
10) 可连接的 std::thread 被销毁或赋值。
11) std::condition_variable::waitstd::condition_variable::wait_untilstd::condition_variable::wait_for 无法达到其后置条件(例如,如果重新锁定互斥锁抛出异常)。
(C++11之后)
12)并行算法 调用的函数通过未捕获的异常退出,并且 执行策略 指定终止。
(C++17之后)

程序也可以直接调用 std::terminate

当由于抛出异常而调用 std::terminate 时,会认为隐式 try/catch 处理程序处于活动状态。 因此,调用 std::current_exception 将返回抛出的异常。

在任何情况下,std::terminate 都将调用当前安装的 std::terminate_handler。 默认 std::terminate_handler 将调用 std::abort

如果析构函数在堆栈展开过程中重置了终止处理程序,并且展开后来导致调用 terminate,则将调用在抛出表达式结束时安装的处理程序。(注意:重新抛出是否应用了新的处理程序是模棱两可的)

(C++11之前)

如果析构函数在堆栈展开过程中重置了终止处理程序,则如果展开后来导致调用 terminate,则调用哪个处理程序是未指定的。

(C++11之后)

[编辑] 注释

如果不需要处理程序机制,例如因为它需要原子操作,而原子操作可能会增加二进制大小,则在异常终止程序时,最好直接调用 std::abort

一些编译器内联函数,例如 __builtin_trap(gcc、clang 和 icc)或 __debugbreak(msvc),可用于尽快终止程序。

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 2111 C++11 在堆栈期间调用 std::set_terminate 的影响
展开与 C++98 不同,并且破坏了一些 ABI
变为未指定

[编辑] 另请参见

std::terminate 调用的函数的类型
(typedef) [编辑]
导致程序异常终止(不进行清理)
(function) [编辑]
在调用时暂停正在运行的程序
(function) [编辑]