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

被折叠的 条评论
为什么被折叠?



