在 Linux 下用 C++ 写程序运行时崩溃(Segmentation fault / 段错误 / 直接 abort)是非常常见的问题。原因通常可以归为以下几类,我按发生频率从高到低给你说明,并附带排查方法。
int* p = nullptr;
*p = 10; // 崩溃
或:
int* p = new int(5);
delete p;
*p = 3; // 野指针
✅ 检查:
nullptrnew 后是否 deleteint a[5];
a[10] = 1; // 崩溃
或:
std::vector<int> v(3);
v[10] = 1; // 可能崩溃(未定义行为)
✅ 使用:
v.at(10); // 会抛异常
std::string* s = new std::string("abc");
delete s;
std::cout << *s; // 崩溃
void f() { f(); }
或:
char buf[10 * 1024 * 1024]; // 栈太大
✅ 解决:
new / std::vector)std::vector<int> v;
// 线程 A 和 B 同时 push_back
✅ 使用:
std::mutexstd::atomicint x;
std::cout << x; // 未定义行为
int& f() {
int x = 10;
return x; // 崩溃隐患
}
Base* b = new Derived();
delete b; // 未定义行为
✅ 基类析构函数:
virtual ~Base() {}
g++ -g main.cpp -o main
gdb ./main
run
# 崩溃后
bt # 查看调用栈
ulimit -c unlimited
./main
gdb ./main core
g++ -fsanitize=address -g main.cpp -o main
./main
能直接告诉你:
std::cerr << "before func" << std::endl;
你可以直接把:
发给我,我可以精确告诉你哪一行、为什么崩、怎么改。
你现在是遇到具体崩溃代码,还是想系统了解原因?