温馨提示×

centos下c++内存泄漏怎查

小樊
43
2026-10-14 19:35:24
栏目: 编程语言

在 CentOS 下排查 C++ 内存泄漏,常用且实用的手段如下,按“从易到难、从快到准”的顺序说明:


一、最常用:Valgrind(推荐首选)

1. 安装

sudo yum install valgrind

2. 使用方式

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

3. 关键输出说明

  • definitely lost:确定泄漏(重点看)
  • indirectly lost:间接泄漏
  • possibly lost:可能泄漏
  • still reachable:程序退出时仍可访问(通常不是重点)

✅ 优点:无需改代码,定位到行
❌ 缺点:程序运行很慢(适合调试环境)


二、快速初步判断:top / free

top
free -m

观察:

  • RES 内存持续增长
  • 不随请求结束而下降

适合确认是否有泄漏,不适合定位代码。


三、生产环境友好:AddressSanitizer(ASan)

1. 编译时开启

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

2. 运行

./main

泄漏时会直接打印调用栈。

✅ 优点:

  • 比 Valgrind 快
  • 定位精准
    ❌ 缺点:
  • 需要重新编译
  • 内存占用更高

四、手动检测:重载 new / delete(轻量)

适合不想引入工具时:

#include <iostream>
#include <map>

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

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

适合:

  • 小工具
  • 粗略看分配/释放是否匹配

五、第三方工具

1. tcmalloc + heap profiler

sudo yum install gperftools

编译:

g++ main.cpp -ltcmalloc

运行:

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

适合:

  • 长期运行服务
  • 性能敏感程序

六、常见泄漏原因(CentOS C++)

  • new 没 delete
  • 容器(vector / map)只加不删
  • 智能指针循环引用
  • 第三方库未释放资源
  • 线程未 join / detach

七、推荐组合

  • 开发调试:Valgrind
  • CI / 单元测试:ASan
  • 线上服务:tcmalloc + pprof

如果你愿意,可以:

  • 贴一段代码
  • 说明是 后台服务 / 命令行程序
  • 是否是 长期运行

我可以给你更具体的排查方案。

0 踩