std::terminate
| ヘッダー <exception> で定義 |
||
void terminate(); |
(C++11まで) | |
| [[noreturn]] void terminate() noexcept; |
(C++11以降) | |
std::terminate() は、プログラムがいずれかの理由で継続できなくなった場合に C++ ランタイムによって呼び出されます。
|
6) std::unexpected の非デフォルトハンドラが、以前に違反された動的例外指定に違反する例外をスローした場合(ただし、その指定に std::bad_exception が含まれていない場合)。
|
(C++17まで) |
|
7) noexcept 指定に違反した場合(この場合、スタックの巻き戻しが行われるかどうかは実装定義です)。
8) キャプチャされた例外を保持していないオブジェクトに対して std::nested_exception::rethrow_nested が呼び出された場合。
9) std::thread の初期関数から例外がスローされた場合。
10) join 可能な std::thread が破棄されたり、代入されたりした場合。
11) std::condition_variable::wait、std::condition_variable::wait_until、または std::condition_variable::wait_for が事後条件を満たせなかった場合(例:ミューテックスの再ロックが例外をスローした場合)。
|
(C++11以降) |
| (C++17以降) |
std::terminate() は、プログラムから直接呼び出されることもあります。
スローされた例外が原因で std::terminate が呼び出された場合、暗黙的な try/catch ハンドラがアクティブであるとみなされます。したがって、std::current_exception を呼び出すと、スローされた例外が返されます。
いずれの場合も、std::terminate は現在インストールされている std::terminate_handler を呼び出します。デフォルトの std::terminate_handler は std::abort を呼び出します。
|
スタック巻き戻しの最中にデストラクタが terminate ハンドラをリセットし、その後、巻き戻しによって |
(C++11まで) |
|
スタック巻き戻しの最中にデストラクタが terminate ハンドラをリセットした場合、その後、巻き戻しによって |
(C++11以降) |
[編集] 注釈
ハンドラメカニズムが不要な場合、例えばアトミック操作が必要でバイナリサイズが肥大化する可能性があるため、プログラムを異常終了させる際には std::abort への直接呼び出しが推奨されます。
一部のコンパイラ組み込み関数(例:__builtin_trap (gcc, clang, icc) または __debugbreak (msvc))は、プログラムを可能な限り速く終了するために使用できます。
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2111 | C++11 | スタック巻き戻し中に std::set_terminate を呼び出した効果が C++98 と異なり、一部の ABI を壊します。 unwinding differs from C++98 and breaks some ABIs |
未規定になった |
[編集] 関連項目
| std::terminate によって呼び出される関数の型 (typedef) | |
| (クリーンアップせずに)異常なプログラム終了を引き起こす (関数) | |
| (C++26) |
呼び出された際に実行中のプログラムを一時停止させる (関数) |