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
相关产品推荐
相关产品推荐

