名前空間
変種
操作

std::terminate

From cppreference.com
< cpp‎ | error
 
 
 
ヘッダー <exception> で定義
void terminate();
(C++11まで)
[[noreturn]] void terminate() noexcept;
(C++11以降)

std::terminate() は、プログラムがいずれかの理由で継続できなくなった場合に C++ ランタイムによって呼び出されます。

1) 例外がスローされ、キャッチされなかった場合(この場合、スタックの巻き戻しが行われるかどうかは実装定義です)。
2) まだキャッチされていない例外を処理中に、例外処理メカニズムによって直接呼び出された関数が例外をスローして終了した場合(例:ローカルオブジェクトのデストラクタ、または catch 節のパラメータを構築するコピーコンストラクタ)。
3) 静的またはスレッドローカル(C++11 以降)オブジェクトのコンストラクタまたはデストラクタが例外をスローした場合。
4) std::atexit または std::at_quick_exit(C++11 以降) で登録された関数が例外をスローした場合。
5) 動的例外指定に違反し、std::unexpected のデフォルトハンドラが実行された場合。
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::waitstd::condition_variable::wait_until、または std::condition_variable::wait_for が事後条件を満たせなかった場合(例:ミューテックスの再ロックが例外をスローした場合)。
(C++11以降)
12) 並列アルゴリズムによって呼び出された関数が未キャッチの例外で終了し、実行ポリシーが終了を指定している場合。
(C++17以降)

std::terminate() は、プログラムから直接呼び出されることもあります。

スローされた例外が原因で std::terminate が呼び出された場合、暗黙的な try/catch ハンドラがアクティブであるとみなされます。したがって、std::current_exception を呼び出すと、スローされた例外が返されます。

いずれの場合も、std::terminate は現在インストールされている std::terminate_handler を呼び出します。デフォルトの std::terminate_handlerstd::abort を呼び出します。

スタック巻き戻しの最中にデストラクタが terminate ハンドラをリセットし、その後、巻き戻しによって terminate が呼び出された場合、スロー式が終了した時点でインストールされていたハンドラが呼び出されるハンドラとなります。(注:再スローが新しいハンドラに適用されるかどうかは曖昧でした)

(C++11まで)

スタック巻き戻しの最中にデストラクタが terminate ハンドラをリセットした場合、その後、巻き戻しによって 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) [編集]
(クリーンアップせずに)異常なプログラム終了を引き起こす
(関数) [編集]
呼び出された際に実行中のプログラムを一時停止させる
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)