在 Linux 下用 C++ 开发时,内存泄漏(memory leak) 是非常常见的问题。下面从常见原因、典型场景、排查工具、最佳实践几个角度系统说明。
最常见原因:用了 new / malloc,但缺少对应的 delete / free。
void func() {
int* p = new int[100];
// 忘记 delete[] p;
}
✅ 正确做法:
delete[] p;
void func() {
int* p = new int[10];
doSomething(); // 可能抛异常
delete[] p;
}
如果 doSomething() 抛异常,delete 不会执行。
✅ 使用 RAII:
std::vector<int> v(10);
int* p = new int[10];
p = new int[20]; // 原来的 10 个 int 泄漏
std::vector<int*> v;
v.push_back(new int(1));
// vector 析构不会 delete
✅ 使用智能指针:
std::vector<std::shared_ptr<int>> v;
struct A {
std::shared_ptr<B> b;
};
struct B {
std::shared_ptr<A> a;
};
✅ 用 weak_ptr 打破循环。
fopen 没 fclosemalloc 配 delete有些工具会报告“still reachable”,不一定是 bug。
valgrind --leak-check=full ./your_program
输出示例:
definitely lost: 400 bytes
编译时加:
g++ -fsanitize=address -g main.cpp
运行即可直接报泄漏位置。
适合简单程序。
图形化分析内存使用。
std::vectorstd::stringstd::mapstd::unique_ptr<int> p(new int(10));
std::shared_ptr<int> q = std::make_shared<int>(20);
资源在构造函数获取,析构函数释放。
| 分配 | 释放 |
|---|---|
| new | delete |
| new[] | delete[] |
| malloc | free |
-Wall -Wextra
Linux C++ 内存泄漏,90% 是因为“该释放的地方没释放”或“异常破坏了释放流程”。
如果你愿意,可以把你的示例代码或 valgrind 报告贴出来,我可以帮你精确定位泄漏点。