命名空间
变体
操作

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