# std::abort

< cpp‎ | utility‎ | program

定义于头文件 `<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 <iostream>
    #include <cstdlib>

    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 received\n";
        } else {
            std::cerr << "Unexpected signal " << signal << " received\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 << "Setup failed\n";
            return EXIT_FAILURE;
        }

        std::abort();  // 引发 SIGABRT
        std::cout << "This code is unreachable\n";
    }

输出：

    Tester ctor
    Tester ctor
    SIGABRT received

### 参阅

exit | 导致正常的程序终止并进行清理 (函数)
atexit | 注册将于调用 std::exit() 时被调用的函数 (函数)
quick_exit (C++11) | 导致快速程序终止，不进行完全的清理 (函数)
at_quick_exit (C++11) | 注册将于调用 `quick_exit` 时被调用的函数 (函数)
signal | 为特定信号设置信号处理函数 (函数)
terminate | 异常处理失败时调用的函数 (函数)