用 Valgrind 检查 Linux 下的 C++ 内存泄漏
Valgrind 是 Linux 环境下最直接有效的内存泄漏检测工具,它不依赖源码修改,能定位到 malloc、new 未配对释放的具体行号。但要注意:必须用 -g 编译,且关闭优化(-O0),否则行号错乱或漏报。
典型使用流程:
- 编译:
g++ -g -O0 -o myapp main.cpp - 运行检测:
valgrind --leak-check=full --show-leak-kinds=all ./myapp - 重点关注输出中
definitely lost和possibly lost的块,它们对应真实泄漏
常见误判点:静态对象析构晚于 Valgrind 报告时机,可能被标为 still reachable——这通常不是泄漏,无需修复。
Windows 下用 CRT 调试堆检测 _CrtDumpMemoryLeaks()
Windows Visual Studio 自带的 CRT 调试堆能在程序退出时自动报告堆分配差异,前提是启用调试堆并正确设置检查点。
立即学习“C++免费学习笔记(深入)”;
关键操作:
- 包含头文件:
#include <crtdbg.h></crtdbg.h> - 在
main()开头调用:_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); - 或手动在退出前加:
_CrtDumpMemoryLeaks();
注意:必须用 Debug 模式编译(/MDd 或 /MTd),Release 模式下 _Crt* 函数为空实现;另外,全局对象的 new 可能早于 _CrtSetDbgFlag 调用,导致漏检,建议把检查点放在 main() 最开头。