c++全局对象的构造时机 by Mr.瑞
先看代码:
[cpp]
#include <windows.h>
#define showdbg(str) \
{\
MessageBoxA(0,#str,"",0);\
};
class A
{
public:
A()
{
showdbg("易做图me");
}
~A()
{
showdbg("end");
}
void dosth()
{
showdbg("something");
}
};
A a;
void main()
{
a.dosth();
}
如果采用了默认的编译和链接方式,结果是三个消息框。
但是我想看看这个全局对象a,是怎么初始化的。
编译:
cl /c /EHsc msg.cpp
链接:
link /entry:main /subsystem:windows /nodefaultlib msg.obj
出现错误:提示未找到_atexit
原因猜测,全局对象它并不会无缘无故地在真正的main函数之前自己初始化。它需要利用到crt函数中的atexit注册某些函数(可能是析构函数)
再使用正常的编译方法:
cl msg.cpp
生成 msg.exe
在调试器中观察,发现全局对象的初始化过程是这样的:
在CRT中,msvcrt.dll 调用了链接器默认库(/nodefaultlib)中的_pre_cpp_init函数(这个函数的会被默认编译进入你的程序)。
just so.
所以书上说的全局对象会在MAIN函数之前自动构造,其实是错误的。它不是自动构造的,是CRT帮你做的。
补充:软件开发 , C++ ,