std::abort

出自cppreference.com
< cpp‎ | utility‎ | program
在2024年3月26日 (二) 05:12由Lynnboy對話 | 貢獻所做的修訂版本

(差異) ←上一修訂 | 最新修訂 (差異) | 下一修訂→ (差異)
 
 
 
 
在標頭 <cstdlib> 定義
void abort();
(C++11 前)
[[noreturn]] void abort() noexcept;
(C++11 起)

導致非正常程序終止,除非傳遞給 std::signal 的信號處理函數正在捕捉 SIGABRT,且該處理函數不返回。

不調用擁有自動、線程局域(C++11 起)和靜態存儲期的對象的析構函數。亦不調用以 std::atexit() std::at_quick_exit(C++11 起) 註冊的函數。是否關閉打開的資源,例如文件是實現定義的。向宿主環境返回指示不成功執行的實現定義狀態。

目錄

[編輯] 參數

(無)

[編輯] 返回值

無,因為它不返回。

[編輯] 異常

不拋出。

[編輯] 註解

POSIX 指定 abort() 函數覆蓋 SIGABRT 信號的阻塞或忽略行為。

某些編譯器內建子程序,例如 __builtin_trap(gcc、clang 及 icc)或 __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; // 不调用析构函数
 
void signal_handler(int signal) 
{
    if (signal == SIGABRT)
        std::cerr << "接收到 SIGABRT\n";
    else
        std::cerr << "接收到非预期的信号 " << signal << "\n";
    std::_Exit(EXIT_FAILURE);
}
 
int main()
{
    Tester automatic_tester; // 不调用析构函数
 
    // 安装处理函数
    auto previous_handler = std::signal(SIGABRT, signal_handler);
    if (previous_handler == SIG_ERR)
    {
        std::cerr << "安装失败\n";
        return EXIT_FAILURE;
    }
 
    std::abort();  // 引发 SIGABRT
    std::cout << "此行代码不可达\n";
}

輸出:

Tester ctor
Tester ctor
接收到 SIGABRT

[編輯] 參閱

導致正常的程序終止並進行清理
(函數) [編輯]
註冊將於調用 std::exit() 時被調用的函數
(函數) [編輯]
導致快速程序終止,不進行完全的清理
(函數) [編輯]
註冊將於調用 quick_exit 時被調用的函數
(函數) [編輯]
為特定信號設置信號處理函數
(函數) [編輯]
異常處理失敗時調用的函數
(函數) [編輯]
abort 的 C 文檔