名稱空間
變體
操作

std::terminate

來自 cppreference.com
< cpp‎ | 錯誤
定義於標頭檔案 <exception>
void terminate();
(C++11 前)
[[noreturn]] void terminate() noexcept;
(C++11 起)

當程式因以下任何原因無法繼續執行時,C++ 執行時會呼叫 std::terminate()

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 規範(在這種情況下,是否進行任何棧展開是實現定義的)。
8) 對未持有捕獲異常的物件呼叫 std::nested_exception::rethrow_nested
9)std::thread 的初始函式丟擲異常。
10) 一個可 join 的 std::thread 被銷燬或賦值。
11) std::condition_variable::waitstd::condition_variable::wait_untilstd::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,那麼在 throw 表示式結束時安裝的處理器將被呼叫。(注意:關於重新丟擲是否應用新處理器存在歧義)

(C++11 前)

如果在棧展開期間解構函式重置了 terminate 處理器,並且展開後來導致呼叫 terminate,那麼呼叫哪個處理器是未指定的。

(C++11 起)

[編輯] 注意

如果不需要處理器機制,例如,因為它需要可能增加二進位制大小的原子操作,那麼在異常終止程式時,最好直接呼叫 std::abort

一些編譯器內部函式,例如 __builtin_trap (gcc, clang, and icc) 或 __debugbreak (msvc),可以用來儘快終止程式。

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 2111 C++11 在棧展開期間呼叫 std::set_terminate 的影響
與 C++98 不同,並破壞了一些 ABI
變為未指定

[編輯] 另請參閱

std::terminate 呼叫的函式型別
(typedef) [編輯]
導致程式異常終止(不進行清理)
(函式) [編輯]
呼叫時暫停正在執行的程式
(函式) [編輯]