std::abort

来自cppreference.com
< cpp‎ | utility‎ | program
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
程序支持工具
程序终止
abort
(C++11)
(C++11)
不可达控制流
与环境交流
信号
信号类型
非局部跳转
类型
 
在标头 <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

参阅

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