Skip to content

程序的结束过程

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);
}