std::abort
來自 cppreference.com
定義於標頭檔案 <cstdlib> |
||
void abort(); |
(C++11 前) | |
[[noreturn]] void abort() noexcept; |
(C++11 起) | |
除非 SIGABRT 被傳遞給 std::signal 的訊號處理程式捕獲且該處理程式不返回,否則會引起程式異常終止。
具有自動、執行緒區域性(C++11 起)和靜態儲存期的變數的解構函式不會被呼叫。透過 std::atexit() 和 std::at_quick_exit(C++11 起) 註冊的函式也不會被呼叫。檔案等開放資源是否關閉由實現定義。向宿主環境返回一個實現定義的狀態,表示執行失敗。
目錄 |
[編輯] 引數
(無)
[編輯] 返回值
無,因為它不返回。
[編輯] 異常
不丟擲任何異常。
[編輯] 注意
POSIX 規定 abort()
函式會覆蓋阻塞或忽略 SIGABRT
訊號的行為。
一些編譯器內在函式,例如 __builtin_trap
(gcc, clang 和 icc) 或 __fastfail
/__debugbreak
(msvc),可用於儘快終止程式。
[編輯] 示例
執行此程式碼
#include <csignal> #include <cstdlib> #include <iostream> class Tester { public: Tester() { std::cout << "Tester ctor\n"; } ~Tester() { std::cout << "Tester dtor\n"; } }; Tester static_tester; // Destructor not called void signal_handler(int signal) { if (signal == SIGABRT) std::cerr << "SIGABRT received\n"; else std::cerr << "Unexpected signal " << signal << " received\n"; std::_Exit(EXIT_FAILURE); } int main() { Tester automatic_tester; // Destructor not called // Setup handler auto previous_handler = std::signal(SIGABRT, signal_handler); if (previous_handler == SIG_ERR) { std::cerr << "Setup failed\n"; return EXIT_FAILURE; } std::abort(); // Raise SIGABRT std::cout << "This code is unreachable\n"; }
輸出
Tester ctor Tester ctor SIGABRT received
[編輯] 參閱
導致程式正常終止並進行清理 (函式) | |
註冊一個函式,在呼叫 std::exit() 時被呼叫 (函式) | |
(C++11) |
導致程式快速終止而不完全清理 (函式) |
(C++11) |
註冊一個函式,在呼叫 std::quick_exit 時被呼叫 (函式) |
為特定訊號設定訊號處理程式 (函式) | |
異常處理失敗時呼叫的函式 (函式) | |
C 文件 關於 abort
|