【文起】爱生活,爱编码,爱蟹儿。为了我跟蟹儿的幸福,奋斗
退出程序的几种方式
1、首先说下程序是如何启动的,前面的读书笔记已经详细写了,这儿再重复下
程序执行的步骤:
A、 检索指向新进程的完整命令行的指针;
B、 检索指向新进程的环境变量的指针;
C、 对C/C++运行期的全局变量进程初始化;
D、 对C运行期间内存单元分配函数和其他底层输入/输出例程使用的内存栈进程初始化;
E、 为所有全局和静态C++类对象调用构造函数
F、 进入接入点函数,执行、退出
G、 调用由_onexit函数的调用而注册的任何函数
H、 为所有全局和静态C++类对象调用析构函数;
I、 调用操作系统的ExitProcess函数
2、有如下程序:
class CSomeObj
{
public:
CSomeObj()
{
printf("Constructor\r\n");
}
~CSomeObj()
{
printf("Destructor\r\n");
}
};
CSomeObj g_GlobalObj;
int _tmain(int argc, _TCHAR* argv[])
{
CSomeObj LocalObj;
ExitProcess(0);
//exit(0);
return 0;
}
调用 ExitProcess(0)时,发现输出为:
Constructor
Constructor
调用exit(0)时,输出为:
Constructor
Constructor
Destructor
调用return 0 时,输出为:
Constructor
Constructor
Destructor
Destructor
其实分析下应该知道:
在Windows下,return 0 的实际执行过程是:
1、先析构main函数内的局部对象,返回至调用main的函数。
2、调用exit函数,由exit函数调用doexit函数,在doexit函数中完成对全局对象的析构。
3、最后调用ExitProcess结束进程。
所以总结下:
ExitProcess不负责任何对象的析构;exit只负责析构全局对象;return 0可以析构局部对象并调用exit,因此能析构全部对象。
如果你使用的是VS2008,将会发现使用ExitProcess时全局变量也被释放了。
这个原因我也没能理解,如果您有好思路,欢迎指出。
【文尾】
如果文章对您有帮助了,请留下您对我和蟹儿的祝福,谢谢~~