terminate_handler でいくつかのクリーンアップがあり、例外をスローする可能性があります。terminate_handler への再帰呼び出しを防ぐために、それをキャッチすることを心配する必要がありますか? gcc では、これは起こり得ないように思われ、単に中断します。それは標準に当てはまりますか、それとも動作は未定義ですか?
2 に答える
終了ハンドラーは戻ることができません(§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();
}
いいえ、から通常のプログラム フローを再開することはできませんstd::terminate
。ただし、関数から別の例外をスローすることはできunexpected
ます。Terminate
まさにそれを行います-プログラムの実行は、完了後に終了します。
編集:
とは言っても、複雑なことをするべきではありませんstd::terminate
-もしそうならterminate
、物事が十分に爆発したので、続行しようとすべきではありません-そして、メモリを割り当てるなどのことをしようとすべきではありませstd::terminate
ん同じ理由 -- メモリ不足の結果、プログラムがそこにある場合はどうなるでしょうか? そこはどうしようもない。