温馨提示×

ubuntu c加加内存泄漏怎么查

小樊
32
2026-10-19 23:48:57
栏目: 智能运维

在 Ubuntu 下排查 C/C++ 内存泄漏,常用方法和工具如下(从简单到专业):


一、最常用:Valgrind(推荐入门)

1. 安装

sudo apt update
sudo apt install valgrind

2. 使用

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

3. 常见输出含义

  • definitely lost:确定泄漏(重点看)
  • indirectly lost:间接泄漏
  • possibly lost:可能泄漏
  • still reachable:程序退出时未释放但可访问

✅ 示例:

int* p = new int[10];
// 忘记 delete[]

Valgrind 会直接指出:

8 bytes in 1 blocks are definitely lost

二、编译时开启 Sanitizer(更高效)

1. AddressSanitizer(ASan)

编译

g++ -fsanitize=address -g -o test test.cpp

运行

./test

✅ 优点:

  • 比 Valgrind 快
  • 能定位具体代码行

✅ 示例错误:

==12345==ERROR: AddressSanitizer: leak of 40 byte(s)

三、LeakSanitizer(和 ASan 一起)

export ASAN_OPTIONS=detect_leaks=1
./test

四、手动方法(不推荐但有用)

1. 重载 new / delete

#include <iostream>
#include <map>

void* operator new(size_t size) {
    void* p = malloc(size);
    std::cout << "Alloc: " << p << std::endl;
    return p;
}

void operator delete(void* p) noexcept {
    std::cout << "Free: " << p << std::endl;
    free(p);
}

⚠️ 仅适合小项目调试


五、专业工具(大型项目)

  • Heaptrack(图形化)
sudo apt install heaptrack
heaptrack ./your_program
heaptrack_gui
  • Massif(Valgrind 子工具):分析堆内存使用

六、常见泄漏原因总结

  • new 没有 delete
  • new[] 用了 delete
  • 构造函数里分配,析构函数忘了释放
  • 容器(vector / map)未清空
  • 智能指针使用错误(循环引用)

七、推荐组合(实战)

✅ 开发阶段:

g++ -fsanitize=address -g

✅ 发布前:

valgrind --leak-check=full

如果你愿意,可以把 代码片段 / 编译方式 / 报错信息 发出来,我可以帮你具体定位泄漏点。

0 踩