这个问题更清楚地说明了这里描述的问题。我做了更多调查,发现堆栈展开没有发生在以下代码中:
class One
{
public:
int x ;
};
class Wrapper
{
public:
Wrapper(CString csText):mcsText(csText)
{
CString csTempText;
csTempText.Format("Wrapper constructor :: %s\n", mcsText);
OutputDebugString(csTempText);
}
~Wrapper()
{
CString csTempText;
csTempText.Format("Wrapper destructor :: %s\n", mcsText);
OutputDebugString(csTempText);
}
CString mcsText;
};
class Test
{
public:
void notifyError()
{
try
{
int x = 10;
}
catch(...) {}
}
void OnRecvBuffer()
{
try
{
Wrapper a("AddRef");
One* p = NULL;
p->x = 10;
}
catch(...)
{
notifyError();
}
}
};
int main()
{
Test* pTest = new Test;
pTest->OnRecvBuffer();
OutputDebugString("Test");
}
我使用 VC6 SP5 编译器编译了这段代码,输出为“Wrapper constructor :: AddRef !!!” (即未调用在堆栈上构造的包装器对象的析构函数。这是预期的行为吗?还是 VC 编译器的错误?我可以使用一些编译器标志以便在这种情况下发生堆栈展开吗?