命名空间
变体
操作

std::abort

来自 cppreference.cn
< cpp‎ | utility‎ | program
 
 
 
 
定义于头文件 <cstdlib>
void abort();
(C++11 前)
[[noreturn]] void abort() noexcept;
(C++11 起)

除非 SIGABRT 被传递给 std::signal 的信号处理程序捕获且该处理程序不返回,否则会引起程序异常终止。

具有自动、线程局部(C++11 起)和静态存储期的变量的析构函数不会被调用。通过 std::atexit() std::at_quick_exit(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; // Destructor not called
 
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; // Destructor not called
 
    // Setup handler
    auto previous_handler = std::signal(SIGABRT, signal_handler);
    if (previous_handler == SIG_ERR)
    {
        std::cerr << "Setup failed\n";
        return EXIT_FAILURE;
    }
 
    std::abort(); // Raise SIGABRT
    std::cout << "This code is unreachable\n";
}

输出

Tester ctor
Tester ctor
SIGABRT received

[编辑] 参阅

导致程序正常终止并进行清理
(函数) [编辑]
注册一个函数,在调用 std::exit() 时被调用
(函数) [编辑]
导致程序快速终止而不完全清理
(函数) [编辑]
注册一个函数,在调用 std::quick_exit 时被调用
(函数) [编辑]
为特定信号设置信号处理程序
(函数) [编辑]
异常处理失败时调用的函数
(函数) [编辑]
C 文档 关于 abort