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