次のような try catch ブロックを持つ関数があります。
bool apple()
{
OutputDebugStringW(L"entered apple");
try {
SomeObj orange;
int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL
}
catch(...) {
OutputDebugStringW(L"leaving apple due to exception");
return false;
}
OutputDebugStringW(L"leaving apple normally.");
return true;
}
DbgView で 1 回見たのは次のとおりです。
entered apple
leaving apple due to exception
leaving apple due to exception
関数は DllMain PROCESS_ATTACH で呼び出されます。何が起こっていますか?残念ながら、コードを再コンパイルしましたが、2 回表示される例外メッセージを再現しようとして元の状態に戻したところ、再現できませんでした。
これは、DbgView 4.79 を使用する Visual Studio 2010 SP1 にあります。OutputDebugString 出力を 2 回使用して出力したものを見たことがありますか?
編集- これに答えてくれた人に感謝します。答えは、NULL ポインター例外に頼ることができないことを指摘しています。Visual Studio では/EHa
、すべてを C++ 例外としてキャッチして、ラップしている関数に問題がある場合は、例外のために中止できるようにしています。/EHa
アクセス違反が に渡されると思っていたのですが、大丈夫catch(...)
ですか? 私はそうだと思いました。