C++ 的 std::terminate() 函数
std::terminate() 是 C++ 标准库的程序终止函数 ,作用是:立即、无条件终止整个程序 ,不执行任何后续代码,是 C++ 异常处理的终极兜底机制。
简单说:程序遇到无法处理的致命错误 → 调用 terminate() → 程序直接退出。
1. 核心特点
- 头文件 :
<exception> - 默认行为 :
- 调用
std::abort()终止程序 - 通常会触发程序崩溃/中断(Windows 弹错误框、Linux 生成 core dump)
- 调用
- 不可恢复 :一旦调用,程序无法继续运行
- 不保证析构 :默认情况下不会执行栈展开,局部对象可能不被析构(资源可能泄漏)
2. 什么情况会自动调用 terminate()?
这是 C++ 面试/开发高频考点,记住这 6 种核心场景:
- 异常没有被任何 catch 捕获
抛出异常后,一直回溯到main都没人处理 → 直接 terminate - 栈展开期间,析构函数抛出异常
栈展开正在清理资源,析构函数又抛新异常 → terminate noexcept函数内抛出异常
承诺不抛异常,却违规抛出 → 直接 terminate- 调用
std::rethrow()但当前没有异常可重抛 - 虚函数表损坏/非法调用纯虚函数
- 主动调用
std::terminate()
3. 极简代码示例
示例1:未捕获异常 → 触发 terminate
cpp
#include <iostream>
using namespace std;
void func() {
throw "我抛出了异常,但没人捕获我!"; // 无 catch
}
int main() {
func();
return 0;
}
✅ 结果:程序直接崩溃,调用 terminate()
示例2:析构函数抛异常 → 触发 terminate
cpp
#include <iostream>
using namespace std;
class Test {
public:
~Test() {
throw "析构函数抛异常!"; // 致命错误
}
};
int main() {
try {
Test obj;
throw "正常异常";
} catch (...) {}
}
✅ 结果:栈展开时触发 terminate(),程序崩溃
4. 自定义 terminate 行为(进阶用法)
你可以用 set_terminate() 替换默认行为,比如:
- 打印日志
- 保存数据
- 做最后的清理工作
cpp
#include <iostream>
#include <exception>
#include <cstdlib>
// 自定义终止函数
void myTerminate() {
std::cerr << "程序崩溃!执行自定义终止逻辑" << std::endl;
std::cerr << "记录崩溃日志..." << std::endl;
std::abort(); // 最终还是要终止程序
}
int main() {
std::set_terminate(myTerminate); // 替换默认 terminate
throw "触发终止"; // 未捕获异常
return 0;
}
5. 关键知识点总结
| 特性 | 说明 |
|---|---|
| 作用 | 无条件终止程序 |
| 触发时机 | 异常无法处理、违规抛异常、代码致命错误 |
| 默认行为 | 调用 abort(),崩溃退出 |
| 栈展开 | 默认不执行,资源可能泄漏 |
| 自定义 | 用 set_terminate() 替换 |
总结
std::terminate()= C++ 程序的紧急停止按钮- 核心触发场景:未捕获异常、析构抛异常、noexcept 抛异常
- 一旦调用,程序立即终止,无法恢复
- 开发原则:避免写出会触发 terminate 的代码