温馨提示×

linux c++内存泄漏如何查

小樊
59
2026-09-11 01:49:37
栏目: 编程语言

在 Linux 下用 C++ 查内存泄漏,常用手段从“轻量级→专业工具”逐步深入。下面按实用顺序给你一套排查思路。


一、最基础:代码层面自查

  1. new / delete、malloc / free 是否配对
    • 每个 new 必须有 delete
    • 每个 malloc 必须有 free
  2. 构造函数 / 析构函数
    • 类里申请了资源,析构函数是否释放
  3. 异常安全
    Foo* p = new Foo();
    func(); // 若抛异常,p 泄漏
    delete p;
    
    用智能指针更安全:
    std::unique_ptr<Foo> p = std::make_unique<Foo>();
    

✅ 推荐:优先用 std::shared_ptr / unique_ptr


二、编译期 / 运行期简单检测

1. 使用 -fsanitize

最简单、最推荐(开发阶段)

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

泄漏示例输出:

==12345==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 40 byte(s) in 1 object(s)

✅ 优点:

  • 不需要改代码
  • 能定位到行号
  • 支持堆溢出、use-after-free

⚠️ 注意:

  • 性能有损耗(开发用)
  • 需 GCC / Clang

三、使用 Valgrind(最经典)

1. 安装

sudo apt install valgrind

2. 使用

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

输出示例:

definitely lost: 64 bytes in 1 blocks

✅ 优点:

  • 非常详细
  • 不需重新编译(但加 -g 更好)

❌ 缺点:

  • 程序运行非常慢(10~50倍)

四、运行时统计法(线上轻量)

1. 重载 new / delete

void* operator new(size_t size) {
    std::cout << "alloc " << size << "\n";
    return malloc(size);
}

适合:

  • 统计分配次数
  • 简单定位异常增长

五、生产环境方案

1. tcmalloc + heap profiler

LD_PRELOAD=/usr/lib/libtcmalloc.so HEAPPROFILE=./heap ./main

生成:

heap.0001.heap

分析:

pprof --text ./main heap.0001.heap

✅ 适合:

  • 长期运行服务
  • 性能影响小

六、常见问题总结

场景 建议
开发调试 AddressSanitizer
本地详细分析 Valgrind
线上服务 tcmalloc / jemalloc
容器环境 ASan + 日志

七、一个最小示例(ASan)

#include <iostream>
int main() {
    int* p = new int[10];
    // 忘记 delete
}
g++ -fsanitize=address -g test.cpp -o test
./test

如果你愿意,可以:

  • 告诉我你是服务端 / 客户端 / 嵌入式
  • 或贴一段怀疑泄漏的代码

我可以帮你具体看。

0 踩