std::terminate
來自 cppreference.com
定義於標頭檔案 <exception> |
||
void terminate(); |
(C++11 前) | |
[[noreturn]] void terminate() noexcept; |
(C++11 起) | |
當程式因以下任何原因無法繼續執行時,C++ 執行時會呼叫 std::terminate()
:
1) 丟擲一個異常且未被捕獲(在這種情況下,是否進行任何棧展開是實現定義的)。
2) 在處理尚未被捕獲的異常時,由異常處理機制直接呼叫的函式透過異常退出(例如,某個區域性物件的解構函式,或構造 catch-子句引數的複製建構函式)。
3) 靜態或執行緒區域性(從 C++11 開始)物件的建構函式或解構函式丟擲異常。
(C++17 前) |
7) 違反 noexcept 規範(在這種情況下,是否進行任何棧展開是實現定義的)。
8) 對未持有捕獲異常的物件呼叫 std::nested_exception::rethrow_nested。
9) 從 std::thread 的初始函式丟擲異常。
10) 一個可 join 的 std::thread 被銷燬或賦值。
11) std::condition_variable::wait、std::condition_variable::wait_until 或 std::condition_variable::wait_for 未能達到其後置條件(例如,如果重新鎖定互斥鎖丟擲異常)。
|
(C++11 起) |
(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, and icc) 或 __debugbreak
(msvc),可以用來儘快終止程式。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2111 | C++11 | 在棧展開期間呼叫 std::set_terminate 的影響 與 C++98 不同,並破壞了一些 ABI |
變為未指定 |
[編輯] 另請參閱
由 std::terminate 呼叫的函式型別 (typedef) | |
導致程式異常終止(不進行清理) (函式) | |
(C++26) |
呼叫時暫停正在執行的程式 (函式) |