std:: terminate
|
定义于头文件
<exception>
|
||
|
void
terminate
(
)
;
|
(C++11 前) | |
|
[
[
noreturn
]
]
void
terminate
(
)
noexcept
;
|
(C++11 起) | |
在以下任一情况下,C++ 运行时会调用
std::terminate()
:
| (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 起) |
| (since 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++标准。
| 缺陷报告 | 适用范围 | 发布行为 | 正确行为 |
|---|---|---|---|
| LWG 2111 | C++11 | 在栈展开期间调用 std::set_terminate 的效果与 C++98 不同且破坏某些 ABI | 改为未指定 |
参阅
|
被
std::terminate
调用的函数类型
(类型定义) |
|
|
导致程序异常终止(不进行清理)
(函数) |
|
|
(C++26)
|
调用时暂停正在运行的程序
(函数) |