std::abort

来自cppreference.com
< cpp‎ | utility‎ | program
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(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)

 
 
在标头 <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 时被调用的函数
(函数)
为特定信号设置信号处理函数
(函数)
异常处理失败时调用的函数
(函数)