在 Ubuntu 下用 C++ 写程序出现段错误(Segmentation fault,SIGSEGV),本质原因只有一个:
程序访问了它不该访问的内存地址
下面按「常见原因 → 排查方法 → 示例」给你系统讲一下。
int* p = nullptr;
*p = 10; // 段错误
或:
MyClass* obj = nullptr;
obj->foo();
int a[5];
a[10] = 1; // 越界,可能段错误
或:
int* p = new int[5];
delete[] p;
p[0] = 1; // 已释放,野指针
int* p = new int(10);
delete p;
cout << *p; // 段错误
void f() {
f(); // 无限递归
}
或超大局部变量:
char buf[1024 * 1024 * 100]; // 栈爆了
delete 了对象// 线程A
delete ptr;
// 线程B
ptr->do(); // 段错误
A& get() {
A a;
return a; // 返回局部变量引用
}
write()、recv() 传了错误指针g++ -g main.cpp -o main
gdb ./main
进入 gdb 后:
run
bt
bt(backtrace)会直接告诉你在哪一行崩溃。
ulimit -c unlimited
./main
生成 core 文件后:
gdb ./main core
bt
g++ -fsanitize=address -g main.cpp -o main
./main
它会精确告诉你:
cout << "before func" << endl;
func();
cout << "after func" << endl;
#include <iostream>
using namespace std;
int main() {
int* p = nullptr;
cout << *p; // 段错误
}
编译运行:
g++ test.cpp
./a.out
Segmentation fault (core dumped)
段错误不是 Ubuntu 的问题,而是你的程序踩了内存红线
如果你愿意,可以把:
bt 输出贴出来,我可以直接帮你定位是哪一行、为什么崩。