名前空間
変種
操作

std::terminate

提供: cppreference.com
< cpp‎ | error
 
 
 
 
ヘッダ <exception> で定義
void terminate();
(C++11以前)
[[noreturn]] void terminate() noexcept;
(C++11およびそれ以降)

std::terminate() は以下の理由のいずれかによって例外処理が失敗したときに C++ のランタイムによって呼ばれます。

1) 例外が投げられ、キャッチされなかった (この場合にスタックの巻き戻しが行われるかどうかは処理系定義です)。
2) 例外処理中に例外が投げられた (例えば何らかのローカルオブジェクトのデストラクタから、または例外処理中に呼ばれる必要のあった関数から)。
3) 静的またはスレッドローカルなオブジェクトのコンストラクタまたはデストラクタが例外を投げた。
4) std::atexit または std::at_quick_exit で登録された関数が例外を投げた。
5) noexcept 指定に違反した (この場合にスタックの巻き戻しが行われるかどうかは処理系定義です)。
6) 動的例外指定に違反し、 std::unexpected に対するデフォルトのハンドラが実行された。
7) std::unexpected に対するデフォルトでないハンドラが以前に違反した動的例外指定に違反し、その指定が std::bad_exception を含まない。
(C++17以前)
8) キャプチャした例外を保持していないオブジェクトに対して std::nested_exception::rethrow_nested が呼ばれた。
9) std::thread の初期関数から例外が投げられた。
10) 合流可能な std::thread が破棄された、または代入された。
11) 並列アルゴリズムによって呼ばれた関数がキャッチされない例外によって脱出し、その実行ポリシーが終了を規定している。
(C++17およびそれ以降)

std::terminate() はプログラムから直接呼ぶこともできます。


いずれの場合でも、 std::terminate は現在設定されている std::terminate_handler を呼びます。 デフォルトの std::terminate_handlerstd::abort を呼びます。

スタックの巻き戻し中にデストラクタが terminate_handler をリセットし、その巻き戻しが後に terminate の呼び出しを発生させた場合、 throw 式の終わりにインストールされていたハンドラが呼ばれるハンドラになります (ノート: 投げ直しが新しいハンドラを適用するかどうかは曖昧です)。

(C++11以前)

スタックの巻き戻し中にデストラクタが terminate_handler をリセットし、その巻き戻しが後に terminate の呼び出しを発生させた場合、どのハンドラが呼ばれるかは未規定です。

(C++11およびそれ以降)

目次

[編集] 引数

(なし)

[編集] 戻り値

(なし)

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2111 C++11 effect of calling set_terminate during stack unwinding differs from C++98 and breaks some ABIs made unspecified

[編集] 関連項目

std::terminate によって呼ばれる関数の型
(typedef) [edit]