在 Linux 下用 C++ 排查内存泄漏,常见且实用的方法如下,按从易到难、从常用到专业的顺序说明:
sudo apt install valgrind # Ubuntu/Debian
valgrind --tool=memcheck --leak-check=full ./your_program
definitely lost:确定泄漏(最严重)indirectly lost:间接泄漏possibly lost:可能泄漏✅ 优点:无需改代码
❌ 缺点:程序运行慢(10~50 倍)
g++ -fsanitize=address -g -O1 main.cpp -o main
./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 → 有泄漏
#include <mcheck.h>
int main() {
mtrace();
// ...
return 0;
}
export MALLOC_TRACE=./log.txt
./program
mtrace ./program ./log.txt
new 没有 deletenew,析构函数没 deletevector<Type*>)shared_ptr 循环引用)delete 没执行✅ 建议:
std::unique_ptr如果你愿意,可以把:
告诉我,我可以给你更针对性的方案。