You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中std::terminate_handler与std::get_terminate的技术疑问

代码示例
#include <iostream>
void block() {
    std::cout << "program blocked";

};
int main() {
    std::terminate_handler tst = block;
    std::set_terminate(tst);
    std::cout << "hello world" << std::endl;
    std::get_terminate()(); 
}
问题解答

问题1:若直接执行std::set_terminate(block),使用std::terminate_handler类型有何益处?

直接传block给std::set_terminate虽然能正常运行,但用std::terminate_handler类型的变量中转有这些实际好处:

  • 类型安全保障:std::terminate_handler是标准规定的函数指针类型(签名为void(*)()),用它声明变量时,编译器会严格检查block的签名是否匹配。要是你不小心给block加了参数或改了返回值,编译器会直接报错,避免隐式类型转换引发的未定义行为。
  • 代码可读性提升:明确标注变量是终止处理函数类型,其他开发者一眼就能明白这个变量的用途,不用额外猜测block的作用。
  • 后续维护便利:如果之后需要把这个终止处理函数存入容器、传递给其他函数,用标准类型比裸函数指针更规范,也更容易扩展。

问题2:在可直接调用std::terminate()的情况下,std::get_terminate()与之有什么区别?

两者的核心差异体现在执行逻辑和使用场景上:

  • std::terminate():它会先调用当前设置的终止处理函数,之后强制终止程序(通常是调用std::abort())。也就是说,不管你的终止处理函数执行完与否,程序最终一定会退出。
  • std::get_terminate()():std::get_terminate()仅返回当前设置的终止处理函数指针,后面的()是手动调用这个函数——它只会执行你自定义的终止逻辑,不会自动终止程序。比如示例代码中,调用完block()后程序就结束了,但如果后续还有代码,是会继续执行的。

一句话总结:std::terminate()是“执行终止逻辑+结束程序”,而get_terminate()()只是“执行终止逻辑”,程序是否终止完全由你自己的代码决定。


内容的提问来源于stack exchange,提问作者maverk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:37:17