std::terminate
来自 cppreference.com
在头文件 <exception> 中定义 |
||
void terminate(); |
(C++11之前) | |
[[noreturn]] void terminate() noexcept; |
(C++11之后) | |
std::terminate()
在以下任何情况下由 C++ 运行时调用:
1) 抛出异常 但未被捕获(在这种情况下,是否进行任何堆栈展开是实现定义的)。
2) 在处理尚未捕获的异常时,由异常处理机制直接调用的函数通过异常退出(例如,一些局部对象的析构函数或构造捕获子句参数的复制构造函数)。
3) 静态 或线程局部(C++11之后) 对象的构造函数或析构函数抛出异常。
(C++17之前) |
7) 违反 noexcept 说明(在这种情况下,是否进行任何堆栈展开是实现定义的)。
8) std::nested_exception::rethrow_nested 被调用,但对象并未保存捕获的异常。
9) 从 std::thread 的初始函数抛出异常。
10) 可连接的 std::thread 被销毁或赋值。
11) std::condition_variable::wait、std::condition_variable::wait_until 或 std::condition_variable::wait_for 无法达到其后置条件(例如,如果重新锁定互斥锁抛出异常)。
|
(C++11之后) |
(C++17之后) |
程序也可以直接调用 std::terminate
。
当由于抛出异常而调用 std::terminate
时,会认为隐式 try/catch 处理程序处于活动状态。 因此,调用 std::current_exception 将返回抛出的异常。
在任何情况下,std::terminate
都将调用当前安装的 std::terminate_handler。 默认 std::terminate_handler 将调用 std::abort。
如果析构函数在堆栈展开过程中重置了终止处理程序,并且展开后来导致调用 |
(C++11之前) |
如果析构函数在堆栈展开过程中重置了终止处理程序,则如果展开后来导致调用 |
(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) | |
(C++26) |
在调用时暂停正在运行的程序 (function) |