terminate() のデフォルトの動作は、次のように関数 set_terminate() を呼び出すことによって変更できます。
// 宣言は標準ヘッダー <exception> に含まれる namespace std { typedef void (*terminate_handler)(); terminate_handler set_terminate(terminate_handler f) throw(); void terminate(); }
terminate() 関数は、次のような場合に呼び出されます。
例外処理機構がユーザー関数 (自動オブジェクトのデストラクタを含む) を呼び出したがその関数が未捕獲の例外を残したまま、別の未捕獲の例外のために終了した
送出された例外のハンドラを例外処理機構が見つけられない
非局所的なオブジェクトが静的なオブジェクトとして存在している間に、その構築または破壊が、例外により終了した
atexit() で登録された関数の実行が例外により終了した
オペランドを持たない throw 式が例外を再送出しようとしたが、例外は現在処理されていない
unexpected()関数以前に違反のあった例外指定が許可しない例外を送出したが、std::bad_exception がその例外指定に含まれていない
unexpected() のデフォルト版が呼び出されている
terminate() は set_terminate() に引数として渡された関数を呼び出します。このような関数はパラメータを持たず、値を返すこともなく、プログラム (または現在のスレッド) を必ず停止します。set_terminate() への最後の呼び出しで渡された関数が呼び出されます。最後に呼び出された set_terminate() に引数として渡された以前の関数が戻り値になります。そのため terminate を使用し、今までに登録された関数を順次呼び出すようにプログラミングすることができます。terminate() のデフォルトの関数は、メインスレッドに対して abort() を呼び出し、他のスレッドに対して thr_exit() を呼び出します。thr_exit() はスタックを巻き戻したり、自動オブジェクトに対する C++ デストラクタを呼び出すことはありません。
呼び出し元に戻ったり、プログラムまたはスレッドを終了しないような関数を terminate() の代用として選択すると、エラーになります。