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

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

          退出程序的几种方式

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

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

 

【文尾】

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

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值