在 Ubuntu 下排查 C++ 内存泄漏,常用方法和工具如下,从简单到专业逐步介绍:
sudo apt update
sudo apt install valgrind
g++ -g -O0 main.cpp -o main
valgrind --leak-check=full ./main
definitely lost:确定泄漏(必须修)indirectly lost:间接泄漏possibly lost:可能泄漏still reachable:程序结束仍未释放(通常问题不大)✅ 优点:不用改代码
❌ 缺点:运行慢(10–50 倍)
g++ -fsanitize=address -g -O1 main.cpp -o main
./main
泄漏时会直接报错,并定位到行号
✅ 优点:
❌ 缺点:
适合简单程序
#include <mcheck.h>
int main() {
mtrace();
int* p = new int[10];
return 0;
}
g++ main.cpp -o main
export MALLOC_TRACE=./log.txt
./main
mtrace ./main ./log.txt
适合服务器程序
sudo apt install google-perftools libgoogle-perftools-dev
export HEAPPROFILE=./heap
./main
生成 heap.0001.heap 等文件,用:
pprof --text ./main heap.0001.heap
new/delete 统计次数std::unique_ptr / shared_ptrnew| 场景 | 推荐 |
|---|---|
| 快速定位 | AddressSanitizer |
| 全量检查 | Valgrind |
| 线上服务 | tcmalloc |
| 教学/小例子 | mtrace |
如果你愿意,可以把:
告诉我,我可以给你更具体的排查方案。