Namespaces
Variants

std:: terminate

From cppreference.net
ヘッダーで定義 <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 specification が違反された場合(この場合にスタックアンワインディングが行われるかどうかは実装定義)。
8) std::nested_exception::rethrow_nested が、捕捉された例外を保持していないオブジェクトに対して呼び出された場合。
9) std::thread の初期関数から例外がスローされた場合。
10) 結合可能な std::thread が破棄された、または代入された場合。
11) std::condition_variable::wait std::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_handler std::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を破壊する
未規定とする

関連項目

std::terminate によって呼び出される関数の型
(typedef)
異常なプログラム終了を引き起こす(クリーンアップなし)
(function)
(C++26)
呼び出されたときに実行中のプログラムを一時停止する
(function)