在 Linux 下用 C++ 出现内存泄漏(memory leak),本质原因只有一个:
申请了内存(或其他资源),但程序结束前没有释放,并且失去了释放它的能力(指针丢失)。
下面从常见原因、Linux 特有因素、示例、排查方法几个角度说明。
new / delete 不匹配int* p = new int[10];
// 错误
delete p; // 应该是 delete[] p;
int* q = new int;
delete[] q; // 未定义行为,可能泄漏
✅ 规则:
new ↔ deletenew[] ↔ delete[]void foo() {
int* p = new int(10);
// 没有 delete p;
}
函数退出后:
p 被销毁void foo() {
int* p = new int;
throw 1;
delete p; // 永远不会执行
}
✅ 正确方式:用智能指针
std::unique_ptr<int> p = std::make_unique<int>();
int* p = new int;
p = new int; // 第一块内存泄漏
std::vector<int*> v;
v.push_back(new int);
// 程序退出前没 delete
class A {
int* p;
public:
A() { p = new int; }
~A() {} // 没 delete p;
};
✅ 正确:
~A() { delete p; }
或更推荐:
std::unique_ptr<int> p;
Linux 使用:
brkmmap即使你 delete:
top / ps 看 RSS 没下降✅ 这是正常现象,不是泄漏
频繁 new/delete 小块内存:
std::stringstd::vectorpthread可能缓存内存,不明显释放
valgrind --leak-check=full ./your_program
输出示例:
definitely lost: 40 bytes
g++ -fsanitize=address -g main.cpp
./a.out
/proc/<pid>/statuscat /proc/$(pidof your_program)/status | grep VmRSS
✅ 90% 泄漏可避免:
newstd::unique_ptrstd::shared_ptrstd::vectorstd::string✅ RAII 原则:
资源获取即初始化,析构即释放
Linux C++ 内存泄漏,不是 Linux 的问题,而是“你申请了内存但没释放,或释放不了”。
如果你愿意,可以把具体代码或 Valgrind 输出贴出来,我可以直接帮你定位是哪一行泄漏。