退出程序的几种方式
1、首先说下程序是如何启动的,前面的读书笔记已经详细写了,这儿再重复下
程序执行的步骤:
A、 检索指向新进程的完整命令行的指针;
B、 检索指向新进程的环境变量的指针;
C、 对C/C++运行期的全局变量进程初始化;
D、 对C运行期间内存单元分配函数和其他底层输入/输出例程使用的内存栈进程初始化;
E、 为所有全局和静态C++类对象调用构造函数
F、 进入接入点函数,执行、退出
G、 调用由_onexit函数的调用而注册的任何函数
H、 为所有全局和静态C++类对象调用析构函数;
I、 调用操作系统的ExitProcess函数
2、有如下程序:
- <span style="font-size:16px;">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;
- }</span>
调用 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,因此能析构全部对象。
ExitProcess是退出代码的意思,其中ExitProcess(0)表示正常退出,ExitProcess(1)表示错误退出。退出代码是给你的父进程或调试你的进程的进程用的,对你的进程来说,用退出代码可以告诉你的父进程或调试进程你的运行结果,是正常不是不正常、出现了什么错误,等等的信息。