温馨提示×

ubuntu c++怎么测内存泄漏

小樊
38
2026-10-05 08:37:08
栏目: 编程语言

在 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 ./main

4. 常见输出解释

  • definitely lost:确定内存泄漏(重点关注)
  • indirectly lost:间接泄漏
  • still reachable:程序结束但没释放(通常问题不大)

✅ 优点:

  • 不用改代码
  • 能定位到具体行号

❌ 缺点:

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

二、AddressSanitizer(ASan,速度快、现代)

1. 编译

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

2. 运行

./main

如果有泄漏,程序结束时会直接打印:

ERROR: LeakSanitizer: detected memory leaks

✅ 优点:

  • 比 Valgrind 快
  • 支持堆栈信息
  • Clang / GCC 都支持

❌ 缺点:

  • 需要重新编译

三、手动计数(适合小项目 / 面试)

示例

#include <cstdlib>
#include <iostream>

int alloc_count = 0;

void* operator new(size_t size) {
    alloc_count++;
    return malloc(size);
}

void operator delete(void* p) noexcept {
    alloc_count--;
    free(p);
}

int main() {
    int* p = new int[10];
    // delete[] p; // 故意不释放
    std::cout << "alloc count: " << alloc_count << std::endl;
}

四、mtrace(GNU 自带,较老旧)

1. 代码

#include <mcheck.h>

int main() {
    mtrace();
    int* p = new int[10];
    // 忘记 delete
    return 0;
}

2. 编译运行

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

五、推荐组合(实战)

场景 推荐
日常调试 AddressSanitizer
深度分析 Valgrind
CI / 测试 ASan
极简环境 Valgrind

六、快速对比总结

Valgrind  → 不用改代码,慢
ASan      → 快,需重编译(首选)
mtrace    → 老,不推荐
手动new   → 学习用

如果你愿意,可以:

  • 贴一段 C++ 代码
  • 或说明你是 服务器 / 桌面 / 嵌入式

我可以帮你选最合适的方案并给你完整示例。

0 踩