最終更新日時: 2017年11月27日 14時01分15秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<exception>

# std::terminate

    namespace std {
      [[noreturn]] void terminate() noexcept;
    }

## 概要

`terminate()`は、プログラムを異常終了させる関数である。

この関数は、特定の状況で呼び出されることが規定されている。

もちろん、ユーザーが任意に呼び出すこともできる。

## この関数が呼び出される状況

以下のいずれかに該当する場合、この`terminate()`関数が呼び出される。

- 以下の場合で例外送出により脱出しようとした
  - 例外オブジェクトの初期化完了後～`catch`節に突入する前の間に呼び出される関数
  - `noexcept`または`noexcept(trueに評価される定数式)`が指定されている関数
  - 例外処理に伴う自動変数（スタック上のオブジェクト）のデストラクタ
  - 非ローカル変数の初期化
  - 静的記憶期間・スレッド静的記憶期間のオブジェクトのデストラクタ
  - `exit()`や`quick_exit()`内で呼び出される`atexit()`や`at_quick_exit()`で登録した関数
  - `set_unexpected()`で登録したハンドラで以下すべてを満たす場合
    - 発端となった例外指定に含まれない例外がハンドラから送出された
    - 発端となった例外指定に`bad_exception`が含まれない
  - スレッドの開始関数（`thread`のコンストラクタで渡した関数）
- 例外処理中でないのに式を持たない`throw`式を実行しようとした
- デフォルトの予想外の例外のハンドラ（`set_unexpected()`が呼び出されていない状況でのハンドラ）が呼び出された
- `nested_exception::rethrow_nested()`が例外を捕捉していない状況で呼び出された
- join可能な`thread`（`thread::joinable()`が`true`であるもの）に対して、デストラクタまたは代入演算子が実行された

## 効果

終了ハンドラを呼び出す。

終了ハンドラは`set_terminate()`で指定できる。

デフォルトの終了ハンドラは`abort()`を呼び出すことと規定されている。

## 戻り値

なし

## 例外

投げない

## 例

    #include <iostream>
    #include <exception>

    int main()
    {
      std::cout << "before terminate" << std::endl;

      std::terminate(); // プログラムを終了させる

      std::cout << "after terminate" << std::endl; // 実行されない
    }

### 出力例

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    terminate called without an active exception

## 参照

- 関係する関数
  - `get_terminate`
  - `set_terminate`
- `terminate`が呼び出される状況
  - N3337 15.5.1 The `std::terminate()` function `[except.terminal]`