std::terminate
来自 cppreference.cn
定义于头文件 <exception> |
||
void terminate(); |
(C++11 前) | |
[[noreturn]] void terminate() noexcept; |
(C++11 起) | |
当程序因以下任何原因无法继续执行时,C++ 运行时会调用 std::terminate()
:
1) 抛出一个异常且未被捕获(在这种情况下,是否进行任何栈展开是实现定义的)。
2) 在处理尚未被捕获的异常时,由异常处理机制直接调用的函数通过异常退出(例如,某个局部对象的析构函数,或构造 catch-子句参数的拷贝构造函数)。
3) 静态或线程局部(从 C++11 开始)对象的构造函数或析构函数抛出异常。
(C++17 前) |
7) 违反 noexcept 规范(在这种情况下,是否进行任何栈展开是实现定义的)。
8) 对未持有捕获异常的对象调用 std::nested_exception::rethrow_nested。
9) 从 std::thread 的初始函数抛出异常。
10) 一个可 join 的 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。
如果在栈展开期间析构函数重置了 terminate 处理器,并且展开后来导致调用 |
(C++11 前) |
如果在栈展开期间析构函数重置了 terminate 处理器,并且展开后来导致调用 |
(C++11 起) |
[编辑] 注意
如果不需要处理器机制,例如,因为它需要可能增加二进制大小的原子操作,那么在异常终止程序时,最好直接调用 std::abort。
一些编译器内部函数,例如 __builtin_trap
(gcc, clang, and icc) 或 __debugbreak
(msvc),可以用来尽快终止程序。
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2111 | C++11 | 在栈展开期间调用 std::set_terminate 的影响 与 C++98 不同,并破坏了一些 ABI |
变为未指定 |
[编辑] 另请参阅
由 std::terminate 调用的函数类型 (typedef) | |
导致程序异常终止(不进行清理) (函数) | |
(C++26) |
调用时暂停正在运行的程序 (函数) |