この質問は、ここで説明されている問題をより明確にします。さらに調査を行ったところ、次のコードではスタックの巻き戻しが行われていないことがわかりました。
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 コンパイラのバグですか?この場合、スタックの巻き戻しが発生するようにコンパイラ フラグを使用できますか?