std::abort
来自 cppreference.cn
定义于头文件 <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() 调用时被调用的函数 (函数) | |
(C++11) |
导致程序快速终止,但不完全清理 (函数) |
(C++11) |
注册一个在 std::quick_exit 调用时被调用的函数 (函数) |
为特定信号设置信号处理程序 (函数) | |
当异常处理失败时调用的函数 (函数) | |
C 文档 关于 abort
|