std::terminate
来自 cppreference.cn
定义于头文件 <exception> |
||
void terminate(); |
(until C++11) | |
[[noreturn]] void terminate() noexcept; |
(since C++11) | |
std::terminate()
由 C++ 运行时在程序因以下任何原因无法继续时调用
1) 抛出 异常 且未被捕获(在这种情况下是否执行任何堆栈解退是实现定义的)。
2) 在处理尚未捕获的异常时,由异常处理机制直接调用的函数通过异常退出(例如,某些局部对象的析构函数,或构造 catch 子句参数的复制构造函数)。
3) 静态或线程局部(since C++11)对象的构造函数或析构函数抛出异常。
(until 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 未能达到其后置条件(例如,如果重新锁定互斥锁抛出异常)。
|
(since C++11) |
(since C++17) |
std::terminate()
也可以直接从程序中调用。
当由于抛出异常而调用 std::terminate
时,会认为隐式 try/catch 处理程序处于活动状态。因此,调用 std::current_exception 将返回抛出的异常。
在任何情况下,std::terminate
都会调用当前安装的 std::terminate_handler。默认的 std::terminate_handler 调用 std::abort。
如果析构函数在堆栈解退期间重置了终止处理程序,并且解退后来导致调用 |
(until C++11) |
如果析构函数在堆栈解退期间重置了终止处理程序,则如果解退后来导致调用 |
(since 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) |