命名空间
变体
操作

std::terminate

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

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

1) 抛出一个异常且未被捕获(在这种情况下,是否进行任何栈展开是实现定义的)。
2) 在处理尚未被捕获的异常时,由异常处理机制直接调用的函数通过异常退出(例如,某个局部对象的析构函数,或构造 catch-子句参数的拷贝构造函数)。
3) 静态或线程局部(从 C++11 开始)对象的构造函数或析构函数抛出异常。
4) 使用 std::atexit std::at_quick_exit(从 C++11 开始) 注册的函数抛出异常。
5) 违反动态异常规范,并执行 std::unexpected 的默认处理程序。
6) std::unexpected 的非默认处理程序抛出异常,如果该规范不包含 std::bad_exception,则此异常违反了先前违反的动态异常规范。
(C++17 前)
7) 违反 noexcept 规范(在这种情况下,是否进行任何栈展开是实现定义的)。
8) 对未持有捕获异常的对象调用 std::nested_exception::rethrow_nested
9)std::thread 的初始函数抛出异常。
10) 一个可 join 的 std::thread 被销毁或赋值。
11) std::condition_variable::waitstd::condition_variable::wait_untilstd::condition_variable::wait_for 未能达到其后置条件(例如,如果重新锁定互斥锁抛出异常)。
(C++11 起)
12)并行算法调用的函数通过未捕获的异常退出,且执行策略指定终止。
(C++17 起)

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

当由于抛出异常而调用 std::terminate 时,一个隐式的 try/catch 处理器被认为是活动的。因此,调用 std::current_exception 将返回抛出的异常。

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

如果在栈展开期间析构函数重置了 terminate 处理器,并且展开后来导致调用 terminate,那么在 throw 表达式结束时安装的处理器将被调用。(注意:关于重新抛出是否应用新处理器存在歧义)

(C++11 前)

如果在栈展开期间析构函数重置了 terminate 处理器,并且展开后来导致调用 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) [编辑]
导致程序异常终止(不进行清理)
(函数) [编辑]
调用时暂停正在运行的程序
(函数) [编辑]