std:: terminate
|
ヘッダーで定義
<exception>
|
||
|
void
terminate
(
)
;
|
(C++11以前) | |
|
[
[
noreturn
]
]
void
terminate
(
)
noexcept
;
|
(C++11以降) | |
std::terminate()
は、以下のいずれかの理由でプログラムを継続できない場合にC++ランタイムによって呼び出されます:
| (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ハンドラをリセットした場合、その後のアンワインディングが
|
(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を破壊する |
未規定とする |
関連項目
|
std::terminate
によって呼び出される関数の型
(typedef) |
|
|
異常なプログラム終了を引き起こす(クリーンアップなし)
(function) |
|
|
(C++26)
|
呼び出されたときに実行中のプログラムを一時停止する
(function) |