abort()是C/C++中用于异常终止进程的函数,不执行atexit注册函数、析构函数或缓冲区刷新;而exit()执行完整清理后正常退出,接受退出码并保证资源释放。

abort() 是什么,它和 exit() 有什么区别
abort() 是 C 标准库函数(声明在 <cstdlib></cstdlib> 中),它会立即终止当前进程,并向操作系统发送 SIGABRT 信号。和 exit() 不同,abort() 不会调用任何通过 atexit() 注册的清理函数,也不会执行局部对象的析构(在 C++ 中),更不会刷新 stdio 缓冲区。
这意味着:
-
abort()更“暴力”,适合检测到不可恢复错误(比如断言失败、内存损坏)时快速退出 -
exit(1)相对温和,会做资源清理,适合正常流程中的异常退出 - 在调试器中触发
abort()通常会中断在出错位置(尤其配合assert时),而exit()不会
在 C++ 中直接调用 abort() 的写法
C++ 中使用 abort() 只需包含头文件并调用即可,无需额外链接:
#include <cstdlib>
<p>int main() {
if (some_unrecoverable_condition) {
abort(); // 程序立即终止,返回值通常是 3(但不保证)
}
}注意:
立即学习“C++免费学习笔记(深入)”;
-
abort()没有参数,也不接受退出码;它总是以实现定义的非零状态退出(POSIX 下通常是 3) - 它的返回类型是
void,所以不能写成return abort();(语法错误) - 不要试图捕获
abort()的“结果”——它不返回,进程直接死掉
abort() 和 assert() 的关系很紧密
assert() 宏底层在表达式为假时就是调用 abort()(当 NDEBUG 未定义时)。例如:
#include <cassert>
#include <iostream>
<p>int main() {
int* p = nullptr;
assert(p != nullptr); // 触发后等价于 abort()
std::cout << "never reached\n";
}常见误区:
- 忘记
assert在发布版中可能被编译器移除(加了-DNDEBUG) - 把
assert(ptr)当作空指针检查逻辑用在关键路径上,结果上线后失效 - 在构造函数或析构函数里用
assert导致异常安全问题(虽然不会抛异常,但可能掩盖设计缺陷)
abort() 被信号处理干扰时的行为
默认情况下,SIGABRT 会导致进程终止并生成 core dump(如果系统允许)。但如果你用 signal() 或 sigaction() 改写了 SIGABRT 的处理方式,abort() 的行为就不可靠了。
例如这段代码是危险的:
#include <csignal>
#include <cstdlib>
<p>void handler(int) { /<em> do nothing </em>/ }
int main() {
signal(SIGABRT, handler); // 错误:覆盖 abort 的默认行为
abort(); // 可能不终止,或行为未定义
}所以:
- 不要重置
SIGABRT处理器,除非你完全清楚后果 - 在多线程程序中,
abort()终止的是整个进程,不是当前线程 - 某些嵌入式或受限环境(如 freestanding 实现)可能不支持
abort(),需查平台文档
abort() 看似简单,但它绕过了所有 C++ 对象生命周期管理,也跳过了常规退出路径。真正要用它,得确认你不是在逃避错误处理,而是确信此刻继续运行比立刻停止更危险。


















