C++ 程序在退出时可能会调用的相关函数

前言

一个程序可能在 main 函数里中通过 return 0; 退出,也可能在任何函数里调用 std::exit(EXIT_SUCCESS) 退出,又或者因为一些错误崩溃退出。本文介绍在开始退出时到程序完全退出调用了那些函数以及资源释放情况。

相关函数列表

  • std::_Exit
  • std::abort
  • std::terminate
  • std::terminate_handler
  • std::quick_exit
  • std::at_quick_exit
  • std::exit
  • std::atexit

函数详情

下文提到的资源包括:线程本地对象、静态变量、C 的文件描述符、std::tmpfile 打开的文件。

std::_Exit

终止程序,不清理资源。

std::abort

终止程序,会调用 SIGABRT 信号的处理函数,这个处理函数不会返回。

std::terminate

std::terminate 调用当前安装的 std::terminate_handler。默认的 std::terminate_handler 调用 std::abort 。

std::quick_exit

终止程序,清理部分资源。以注册顺序的逆序调用传递给 std::at_quick_exit 的函数。若调用这些函数抛出异常,则调用 std::terminate 。调用所有注册的函数后,调用 std::_Exit(exit_code) 。

不调用传递给 std::atexit 的函数。

std::exit

终止程序,清理所有资源(不包括栈上的对象)。

清理顺序:

  1. 所有的线程本地在静态变量前析构(如果 thread_local 有 static 修饰,依然在这一步析构)。
  2. 静态变量和通过 std::atexit 注册的函数按构造和注册 的顺序逆序析构(因此两者可以穿插进行)。
  3. 关闭所有的 C 文件流。
  4. 移除 std::tempfile。

不调用传递给 std::at_quick_exit 的函数。

总结

不同退出方式会调用的函数

你可能感兴趣的:(C++ 程序在退出时可能会调用的相关函数)