Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法

本文深入探讨了C++中局部静态对象的构造函数为何仅执行一次,及程序退出时如何执行其析构函数。通过分析编译器设置的标志位和_atexit指令,揭示了局部静态对象的生命周期管理机制。

代码

class A
{
public:
	A() {}
	~A() {}
};

void func()
{
	static A a;
}

int main()
{
	func();
	return 0;
}

问题

1、函数中的局部静态对象只执行一次构造函数的原因。

答案:

因为编译器为该局部对象设置了标志位,来表示该对象是否已经执行了构造函数。

详情可以通过汇编代码来查看,如下所示:

函数执行到黄色箭头所指的位置时,对象 a 的内存中的内容为

当执行完如下代码时,

009F185E  call        __Init_thread_header (09F1050h) 

对象 a 的内存中的内容就变成了如下图片所示

程序继续向下执行,当执行到如下代码位置时, 

对象 a 的内存中的位置就变成了如下图所示的内容

可以发现,每个静态局部对象后面都跟着一个标志位,来标明该对象是否已经执行了构造函数。这样就确保了对象的构造函数只执行一次。

2、程序退出时如何执行静态局部对象的析构函数。

答案:

因为在静态局部变量执行完构造函数之后,会执行 _atexit (地址) 指令,该指令上面的那条指令后面跟的地址就是执行静态局部对象的析构函数的代码段的地址。

该指令的功能是指明在 main 函数执行完毕之后需要执行的代码片段。

通过上述的功能,就实现了 main 函数执行完毕之后,知道有哪些静态局部对象需要执行析构函数。

如下图所示:

再看下地址 0x009F7250 的内容,如下图所示:

 

(SAW:Game Over!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值