Windows核心编程<读书笔记四>return exit(0) ExitProcess的不同之处

来源:互联网 发布:苹果6突然只有2g网络 编辑:程序博客网 时间:2024/05/29 13:04

【文起】爱生活,爱编码,爱蟹儿。为了我跟蟹儿的幸福,奋斗奋斗

          退出程序的几种方式

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时全局变量也被释放了。

这个原因我也没能理解,如果您有好思路,欢迎指出。

 

【文尾】

如果文章对您有帮助了,请留下您对我和蟹儿的祝福,谢谢~~

 

 

 


 

原创粉丝点击