程序的结束过程
1. 返回值处理
当main()返回一个值(通常是int类型)时,这个值会被传递给操作系统作为程序的退出状态码。
2. 静态对象的析构
在C++程序中,全局和静态对象的析构函数会在main()返回后被调用。
#include <iostream>
class Test {
public:
~Test() {
std::cout << "Test destructor called AFTER main() returns" << std::endl;
}
};
// 全局对象
Test globalTest;
int main() {
std::cout << "Inside main()" << std::endl;
return 0;
}
3. atexit()注册的函数
C和C++标准库提供了atexit()
函数,允许注册在程序正常终止时要调用的函数。这些函数会在main()返回后执行:
#include <stdio.h>
#include <stdlib.h>
void cleanupFunction() {
printf("Cleanup after main() returns\n");
}
int main() {
atexit(cleanupFunction);
printf("Inside main()\n");
return 0;
}
4. C运行时库的清理工作
在main()返回后,C运行时库(CRT)会执行一系列清理工作:
- 关闭所有打开的文件流
- 释放动态分配的内存
- 恢复终端状态
- 其他系统资源的释放
5. exit()函数的调用
当main()返回时,C/C++运行时会隐式调用exit()
函数,将main()的返回值作为参数。实际上,以下两段代码在行为上是等价的:
int main() {
// 代码...
return 0;
}
int main() {
// 代码...
exit(0);
}