温馨提示×

ubuntu c++内存泄漏如何查

小樊
58
2026-09-14 13:06:27
栏目: 编程语言

在 Ubuntu 下排查 C++ 内存泄漏,常用方法和工具如下,从简单到专业逐步介绍:


一、最常用:Valgrind(推荐新手/通用)

1. 安装

sudo apt update
sudo apt install valgrind

2. 编译程序(带调试信息)

g++ -g -O0 main.cpp -o main

3. 运行检测

valgrind --leak-check=full ./main

4. 常见输出含义

  • definitely lost:确定泄漏(必须修)
  • indirectly lost:间接泄漏
  • possibly lost:可能泄漏
  • still reachable:程序结束仍未释放(通常问题不大)

✅ 优点:不用改代码
❌ 缺点:运行慢(10–50 倍)


二、高性能方案:AddressSanitizer(ASan,推荐)

1. 编译

g++ -fsanitize=address -g -O1 main.cpp -o main

2. 运行

./main

泄漏时会直接报错,并定位到行号

✅ 优点:

  • 速度快
  • 定位精准
  • 还能检测越界、double free

❌ 缺点:

  • 内存占用变大
  • 不能和 Valgrind 混用

三、运行时统计:mtrace(glibc 自带)

适合简单程序

1. 代码

#include <mcheck.h>
int main() {
    mtrace();
    int* p = new int[10];
    return 0;
}

2. 编译运行

g++ main.cpp -o main
export MALLOC_TRACE=./log.txt
./main

3. 查看

mtrace ./main ./log.txt

四、生产环境:tcmalloc + heap profiler

适合服务器程序

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_ptr
  • 避免裸 new
  • 检查异常路径是否释放资源

六、工具选择建议

场景 推荐
快速定位 AddressSanitizer
全量检查 Valgrind
线上服务 tcmalloc
教学/小例子 mtrace

如果你愿意,可以把:

  • 程序规模(小工具 / 服务器)
  • 是否多线程
  • 是否用第三方库(如 Boost、Qt)

告诉我,我可以给你更具体的排查方案。

0 踩