命名空间
变体
操作

std::terminate

来自 cppreference.cn
< cpp‎ | error
定义于头文件 <exception>
void terminate();
(until C++11)
[[noreturn]] void terminate() noexcept;
(since C++11)

std::terminate() 由 C++ 运行时在程序因以下任何原因无法继续时调用

1) 抛出 异常 且未被捕获(在这种情况下是否执行任何堆栈解退是实现定义的)。
2) 在处理尚未捕获的异常时,由异常处理机制直接调用的函数通过异常退出(例如,某些局部对象的析构函数,或构造 catch 子句参数的复制构造函数)。
3) 静态或线程局部(since C++11)对象的构造函数或析构函数抛出异常。
4) 注册到 std::atexit std::at_quick_exit(since C++11) 的函数抛出异常。
5) 动态异常规范 被违反,并且执行 std::unexpected 的默认处理程序。
6) std::unexpected 的非默认处理程序抛出异常,该异常违反了先前违反的动态异常规范,如果该规范不包含 std::bad_exception
(until 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 未能达到其后置条件(例如,如果重新锁定互斥锁抛出异常)。
(since C++11)
12)并行算法调用的函数通过未捕获的异常退出,并且执行策略指定终止。
(since C++17)

std::terminate() 也可以直接从程序中调用。

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

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

如果析构函数在堆栈解退期间重置了终止处理程序,并且解退后来导致调用 terminate,则将调用在 throw 表达式末尾安装的处理程序。(注意:重新抛出是否应用了新的处理程序是模棱两可的)

(until C++11)

如果析构函数在堆栈解退期间重置了终止处理程序,则如果解退后来导致调用 terminate,则未指定调用哪个处理程序。

(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) [编辑]
调用时暂停正在运行的程序
(function) [编辑]