在 Linux 下用 C++ 出现内存泄漏,通常不是 Linux 本身的问题,而是 C++ 内存管理使用不当。下面从 常见原因 → 示例 → 排查方法 → 预防建议 系统说明。
内存泄漏:
程序在堆上申请了内存(new / malloc),但 没有释放,且 后续无法再访问这块内存。
在 Linux 中:
new / delete 不匹配(最常见)int* p = new int[10];
delete p; // ❌ 应该是 delete[]
✅ 正确:
delete[] p;
void func() {
int* p = new int(10);
// 没有 delete
}
void func() {
int* p = new int(10);
throw std::runtime_error("error");
delete p; // ❌ 永远不会执行
}
✅ 正确做法(RAII):
std::unique_ptr<int> p = std::make_unique<int>(10);
int* p = new int(10);
p = new int(20); // ❌ 第一块内存泄漏
std::vector<int*> v;
v.push_back(new int(10));
// 程序结束前没 delete
✅ 推荐:
std::vector<std::unique_ptr<int>> v;
struct Node {
std::shared_ptr<Node> next;
};
两个 shared_ptr 互相指向 → 引用计数永远不为 0
✅ 解决:
std::weak_ptr<Node> next;
void* p = malloc(100);
delete p; // ❌ 未定义行为
✅ 规则:
malloc ↔ freenew ↔ delete例如:
char* p = lib_func_alloc();
// 忘了调用 lib_func_free(p)
✅ 必须看库文档
class Base {
public:
~Base() {} // ❌ 非 virtual
};
class Derived : public Base {
int* p = new int;
};
Base* b = new Derived;
delete b; // ❌ Derived 的析构函数不会调用
✅ 正确:
virtual ~Base() {}
g++ -g main.cpp -o main
valgrind --leak-check=full ./main
输出示例:
definitely lost: 40 bytes in 1 blocks
g++ -fsanitize=address -g main.cpp -o main
./main
✅ 优点:
top
ps aux
cat /proc/<pid>/status
关注:
VmRSSVmSize✅ 优先使用 RAII
std::unique_ptrstd::shared_ptrstd::vector / std::string✅ 避免裸 new / delete
✅ 构造函数申请,析构函数释放
✅ 基类析构函数必须是 virtual
✅ 异常安全设计
✅ 长期运行程序定期压测 + 内存监控
Linux C++ 内存泄漏的本质原因:
“申请了内存,却因为逻辑、异常、设计问题,没有正确释放。”
如果你愿意,可以把 具体代码贴出来,我可以帮你 精确定位是哪一行在泄漏。