温馨提示×

linux c++内存泄漏怎么查

小樊
54
2026-09-05 05:17:55
栏目: 编程语言

在 Linux 下用 C/C++ 查内存泄漏,常用方法和工具如下,按“从简单到专业”给你一个清单:


一、最常用:Valgrind(首选)

1. 安装

sudo apt install valgrind   # Ubuntu/Debian

2. 使用

valgrind --tool=memcheck --leak-check=full ./your_program

3. 常见输出含义

  • definitely lost:确定泄漏(必须修)
  • indirectly lost:间接泄漏
  • possibly lost:可能泄漏
  • still reachable:程序退出时还没释放(不一定算 bug)

✅ 优点:不用改代码,最权威
❌ 缺点:程序变慢(10~50倍)


二、编译期检测:AddressSanitizer(推荐)

1. 编译时加选项

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

2. 直接运行

./main

泄漏会直接打印调用栈,定位非常快。

✅ 优点:

  • 速度快
  • 定位准确
  • 支持栈/堆/全局

❌ 缺点:

  • 需要重新编译
  • 不支持老系统

三、手动统计(轻量方案)

自己封装 new/deletemalloc/free

void* operator new(size_t size) {
    void* p = malloc(size);
    log_alloc(p, size);
    return p;
}

void operator delete(void* p) {
    log_free(p);
    free(p);
}

适合:

  • 嵌入式
  • 不能装工具的环境

四、智能指针(预防为主)

std::shared_ptr<T>
std::unique_ptr<T>

✅ 从根本上减少泄漏


五、其他工具(进阶)

  • mtrace(glibc 自带)
  • heaptrack(图形化分析)
  • gperftools(tcmalloc)

六、排查思路建议

  1. 先看 Valgrind / ASan 报告
  2. 看泄漏大小是否持续增长
  3. 检查:
    • newdelete
    • 容器没清空
    • 回调函数持有引用
  4. std::string / vector 代替裸指针

如果你愿意,可以把:

  • 程序类型(服务 / 命令行 / 嵌入式)
  • 是否可重编译
  • 是否有持续内存增长

发给我,我可以给你最合适的排查方案

0