0

次のような 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(...)ですか? 私はそうだと思いました。

4

3 に答える 3

0

その未定義の動作 (何かが起こる可能性があります (そしてそう思われます)):

int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL

NULL ポインターを介した要素へのアクセスは未定義の動作です。この時点以降、プログラムは自由に何でもできるので、表示されるものはすべて有効な出力です。

于 2012-09-30T18:43:21.510 に答える
0

NULL ポインターへのアクセスの例外をキャッチすることにより、Visual C++ 固有の動作に依存しています。したがって、これはこの動作をコーディングする良い方法ではありません。これを行うには、NULL をテストするのが正しい方法です。も参照してください...ヌルポインタ例外をキャッチする方法は?

于 2012-09-30T19:00:12.200 に答える
0

NULL をチェックしてから、自分で例外をスローして、何かが変わるかどうかを確認してください。未定義の動作が原因であるかどうか、または実際に他の問題があるかどうかを確認するのに役立つ場合があります。

于 2012-09-30T19:52:27.420 に答える