名稱空間
變體
操作

std::abort

來自 cppreference.com
< cpp‎ | utility‎ | program
 
 
 
 
定義於標頭檔案 <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() 時被呼叫
(函式) [編輯]
導致程式快速終止而不完全清理
(函式) [編輯]
註冊一個函式,在呼叫 std::quick_exit 時被呼叫
(函式) [編輯]
為特定訊號設定訊號處理程式
(函式) [編輯]
異常處理失敗時呼叫的函式
(函式) [編輯]
C 文件 關於 abort