“Linux C++ 为何崩溃”是一个很常见但很宽泛的问题。我给你一个结构化排查思路 + 最常见原因清单,你可以对照定位;如果你愿意,把崩溃现象 / 日志 / 示例代码贴出来,我可以更精确地帮你分析。
这是 Linux C++ 程序崩溃的头号原因。
Segmentation fault)Bus error)| 原因 | 示例 |
|---|---|
| 空指针解引用 | int* p = nullptr; *p = 1; |
| 野指针 | delete p; p->x = 1; |
| 越界访问 | arr[100](数组只有 10) |
| 栈溢出 | 递归太深、大对象在栈上 |
| double free | 同一指针 delete 两次 |
| 使用已释放内存 | delete p; use(p); |
✅ 特征:崩溃点往往不是真正出错点(内存早就坏了)
Linux 下多线程程序非常容易“随机崩溃”。
std::thread 对象析构时仍 joinable✅ 特征:
| 原因 | 说明 |
|---|---|
| 文件描述符耗尽 | open() 太多 |
| 栈空间不足 | 递归 / 大局部变量 |
| mmap 失败 | 内存映射错误 |
| 权限不足 | 访问 /proc、/dev 等 |
libstdc++ / libc++ 混用✅ 特征:程序启动即崩,或调用某个库函数时崩
SIGSEGV / SIGFPE 后没正确处理dmesg | tail
常见信号:
| 信号 | 含义 |
|---|---|
| SIGSEGV | 非法内存访问 |
| SIGABRT | assert / abort |
| SIGFPE | 除 0 |
| SIGBUS | 对齐 / mmap 错误 |
gdb ./your_program
run
bt
如果已经崩过:
gdb ./your_program core
bt
ulimit -c unlimited
./your_program
生成的 core 文件可直接分析。
g++ -fsanitize=address -g main.cpp
./a.out
g++ -fsanitize=thread -g main.cpp
assert(ptr != nullptr);
如果 assert 失败,程序会直接 abort。
int* p = nullptr;
*p = 10; // SIGSEGV
int a[5];
a[10] = 1;
std::thread t([]{
// do something
});
// 没 join / detach
你可以直接贴出:
Segmentation fault (core dumped)
例如:
“我在 Ubuntu 22.04,g++ 11,程序在调用 vector push_back 时崩溃,bt 显示 std::mutex 相关,这是为什么?”
我可以一步一步帮你定位 ✅