Namespaces
Variants

std:: abort

From cppreference.net
Utilities library
定义于头文件 <cstdlib>
void abort ( ) ;
(C++11 前)
[ [ noreturn ] ] void abort ( ) noexcept ;
(C++11 起)

除非 SIGABRT 正被传递给 std::signal 的信号处理器捕获且该处理器未返回,否则将导致程序异常终止。

具有自动 、线程局部 (since C++11) 和静态 存储期 的变量的析构函数不会被调用。通过 std::atexit() std::at_quick_exit (since 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; // 析构函数不会被调用
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

参见

导致程序正常终止并进行清理
(函数)
注册在调用 std::exit() 时要调用的函数
(函数)
(C++11)
导致程序快速终止而不完全清理
(函数)
注册在调用 std::quick_exit 时要调用的函数
(函数)
为特定信号设置信号处理程序
(函数)
异常处理失败时调用的函数
(函数)
C 文档 for abort