0

terminate_handler でいくつかのクリーンアップがあり、例外をスローする可能性があります。terminate_handler への再帰呼び出しを防ぐために、それをキャッチすることを心配する必要がありますか? gcc では、これは起こり得ないように思われ、単に中断します。それは標準に当てはまりますか、それとも動作は未定義ですか?

4

2 に答える 2

4

終了ハンドラーは戻ることができません(§18.6. 3.1/2)。プログラムを終了する必要があります (デフォルトのハンドラーは を呼び出しますabort())。構成されている場合:

void my_terminate()
{
    throw 5;
}

プログラムを終了せずに(例外が伝播するため)関数を終了するため、未定義の動作が発生します。したがって、スローされる可能性のあるコードがある場合は、次のようにすべての例外を確実にキャッチしてください。

void my_terminate()
{
    try
    {
        // stuff
    }
    catch(...)
    {
        // too bad
    }

    abort();
}

ただし(タイトルの質問に答えるために)、再度入力することを制限するものは何も表示されないため、技術的には問題ないはずです。

void my_terminate()
{
    static int counter = 0;

    if (counter++ < 5)
        terminate();

    abort();
}
于 2010-08-23T23:14:50.753 に答える
1

いいえ、から通常のプログラム フローを再開することはできませんstd::terminate。ただし、関数から別の例外をスローすることはできunexpectedます。Terminateまさにそれを行います-プログラムの実行は、完了後に終了します。

編集:

とは言っても、複雑なことをするべきではありませんstd::terminate-もしそうならterminate、物事が十分に爆発したので、続行しようとすべきではありません-そして、メモリを割り当てるなどのことをしようとすべきではありませstd::terminateん同じ理由 -- メモリ不足の結果、プログラムがそこにある場合はどうなるでしょうか? そこはどうしようもない。

于 2010-08-23T23:09:59.457 に答える