Namespaces
Variants

std:: terminate

From cppreference.net
定义于头文件 <exception>
void terminate ( ) ;
(C++11 前)
[ [ noreturn ] ] void terminate ( ) noexcept ;
(C++11 起)

在以下任一情况下,C++ 运行时会调用 std::terminate()

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
(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 起)
12) 并行算法 调用的函数通过未捕获的异常退出,且 执行策略 指定终止处理。
(since 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 和 icc)或 __debugbreak (msvc),可用于以最快速度终止程序。

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 适用范围 发布行为 正确行为
LWG 2111 C++11 在栈展开期间调用 std::set_terminate 的效果与 C++98 不同且破坏某些 ABI 改为未指定

参阅

std::terminate 调用的函数类型
(类型定义)
导致程序异常终止(不进行清理)
(函数)
(C++26)
调用时暂停正在运行的程序
(函数)