这个问题提供了更多关于此处描述的问题的澄清。我进行了更多的调查,发现以下代码段中没有发生堆栈展开:
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编译器的一个错误?我能否使用一些编译器标志使堆栈展开在这种情况下发生?