温馨提示×

linux c++内存泄漏怎查

小樊
41
2026-10-08 00:35:21
栏目: 编程语言

在 Linux 下用 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:可能泄漏
  • 调用栈(call stack):直接定位到代码行

✅ 优点:无需改代码
❌ 缺点:程序运行慢(10~50 倍)


二、轻量级:AddressSanitizer(推荐)

1. 编译时加选项

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

2. 直接运行

./main

泄漏时会直接打印:

  • 泄漏大小
  • 分配位置(文件+行号)

✅ 优点:比 Valgrind 快很多
✅ 适合开发阶段


三、自己加“内存计数器”

适合不想用工具时:

#include <iostream>
static int alloc_count = 0;

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

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

int main() {
    // ...
    std::cout << "alloc_count: " << alloc_count << std::endl;
}

程序退出时 alloc_count != 0 → 有泄漏


四、第三方工具

1. mtrace(glibc 自带)

#include <mcheck.h>
int main() {
    mtrace();
    // ...
    return 0;
}
export MALLOC_TRACE=./log.txt
./program
mtrace ./program ./log.txt

2. 专业工具

  • Heaptrack(图形化,强)
  • memwatch
  • LeakSanitizer(LSan)

五、常见 C++ 泄漏原因(重点排查)

  1. new 没有 delete
  2. 构造函数里 new,析构函数没 delete
  3. 容器里存指针(vector<Type*>)
  4. 智能指针用错(shared_ptr 循环引用)
  5. 异常导致 delete 没执行

✅ 建议:

  • 尽量用 std::unique_ptr
  • 少用裸指针

六、推荐组合(实战)

  • 开发阶段:AddressSanitizer
  • 上线前:Valgrind
  • 长期监控:Heaptrack

如果你愿意,可以把:

  • 程序规模(小/中/大)
  • 是否多线程
  • 是否用 STL / 智能指针

告诉我,我可以给你更针对性的方案。

0 踩