在《INSIDE C++ MODEL》书中247页提到了如下一段话:
“shiyon给被静态初始化的objects,有一些缺点。例如,如果exceptiony handling被支持,那些objects将不能够被放置于Atry区段之内...."
想了一段时间才想明白这个问题,下面用一段代码来说明一下:
A.cpp
class A
{
}
int main()
{
try
{
static A obj;
int i = 0;
int c = 10 /i; //throw exception
}
catch(...)
{
}
}
对于main函数中的A obj,应该都知道,编译器会针对obj做一个唯一性初始化
即:
A* pObj = 0;
int main()
{
try
{
static A obj;
(pObj == 0) ? 0: obj.::A(), pObj = &obj;
int i = 0;
int c = 10 /i; //throw exception
}
catch(...)
{
(pObj == 0) ? 0 : obj::~A(), pObj =0;
} (pObj == 0) ? 0 : obj::~A(), pObj =0;
}
对于try-catch,有一个这样的特性,对于try中出现的局部变量,会在catch中生成其析构函数的调用,这个就会和main()末尾的析构重叠了。