前言
一个程序可能在 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
终止程序,清理所有资源(不包括栈上的对象)。
清理顺序:
- 所有的线程本地在静态变量前析构(如果 thread_local 有 static 修饰,依然在这一步析构)。
- 静态变量和通过 std::atexit 注册的函数按构造和注册 的顺序逆序析构(因此两者可以穿插进行)。
- 关闭所有的 C 文件流。
- 移除 std::tempfile。
不调用传递给 std::at_quick_exit 的函数。
网友评论