温馨提示×

Ubuntu C++内存泄漏怎么查

小樊
35
2026-10-22 22:23:58
栏目: 编程语言

在 Ubuntu 下排查 C++ 内存泄漏,常用的方法和工具如下,从「最推荐」到「进阶」依次介绍。


一、最推荐:Valgrind(免费、强大)

1️⃣ 安装

sudo apt update
sudo apt install valgrind

2️⃣ 编译程序(必须带 -g)

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

3️⃣ 运行检测

valgrind --leak-check=full --show-leak-kinds=all ./main

4️⃣ 常见输出解释

  • definitely lost:确定泄漏(重点看)
  • indirectly lost:间接泄漏
  • possibly lost:可能泄漏
  • still reachable:程序退出时还指着(不一定算 bug)

✅ 适合:本地调试、定位具体代码行

⚠️ 缺点:运行慢(10~50 倍)


二、AddressSanitizer(ASan,速度快,推荐)

1️⃣ 编译

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

2️⃣ 直接运行

./main

3️⃣ 特点

  • 能检测:
    • 内存泄漏
    • 越界访问
    • use-after-free
  • 报错信息非常清晰(文件+行号)

✅ 适合:开发阶段、CI

⚠️ 注意:

  • 不能和 Valgrind 一起用
  • 需要重新编译

三、mtrace(glibc 自带,轻量)

1️⃣ 代码中加

#include <mcheck.h>

int main() {
    mtrace();
    // your code
    return 0;
}

2️⃣ 编译运行

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

3️⃣ 分析结果

mtrace ./main ./mtrace.log

✅ 简单
❌ 功能弱,不如 Valgrind / ASan


四、手动检测(智能指针 & RAII)

常见泄漏原因

  • new 没 delete
  • 异常路径没释放
  • 容器里存裸指针

推荐写法

std::unique_ptr<int> p = std::make_unique<int>(10);
std::shared_ptr<int> q = std::make_shared<int>(20);

✅ 能在编码阶段避免 90% 泄漏


五、线上 / 长期运行程序

1️⃣ Heaptrack(适合长期运行)

sudo apt install heaptrack
heaptrack ./main
heaptrack_gui heaptrack.main.*.gz

2️⃣ 监控内存增长

top
htop
pmap -x <pid>

六、快速选择建议

场景 推荐
本地调试 Valgrind
开发阶段 ASan
轻量检测 mtrace
线上服务 Heaptrack
防泄漏 智能指针

如果你愿意,可以:

  • 贴一段 可疑代码
  • 或说你是 命令行程序 / 服务端 / 嵌入式

我可以帮你选最合适的方案并一步步排查。

0 踩