今天分享一下内存泄漏在不同平台的检测方法。
linux/maxos 系统:
使用 valgrind 工具(可在linux、macos系统,以及windows中使用wsl系统下的linux环境使用,不能直接在windows中使用)
安装方法:
CentOS 系统:
yum install -y valgrind
Ubuntu 系统:
apt update
apt install -y valgrind
使用方法
使用要求:编译程序时使用调试信息选项 -g(方便检测泄露的代码行数),例如:
g++ -g test.cpp -o test.exe
使用 valgrind 运行程序:
valgrind --leak-check=full ./your_program
参数 | 描述 |
---|---|
–leak-check=full | 启用详细的内存泄漏检测 |
–track-origins=yes | 在内存未初始化时,报告其来源 |
–log-file=filename | 将 valgrind 的输出写入文件 filename |
windows 系统:
下载安装VLD(Visual Leak Detector),最高支持到VS2015版本(实测只要附加包含VLD的头文件目录,以及附加依赖库文件目录,在更高的VS版本也可用),可在Qt中使用。注意:VLD 无法在 minGW 下使用,只能使用 MSVC 编译器。
安装方法:
下载链接:https://github.com/KindDragon/vld/releases/download/v2.5.1/vld-2.5.1-setup.exe
使用安装包安装,安装过程中默认把VLD的头文件和库的目录添加到VC项目中
使用方法
新建一个 C++ 控制台程序:
因为版本问题,如果使用windows 2000或者以前的版本,需要将dbghelp.dll拷贝到你的程序的运行目录下,或其他可以引用到的目录。
接下来需要将其加入到自己的代码中。方法很简单,只要在包含入口函数的.cpp文件中包含vld.h就可以。如果这个cpp文件包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。
#include <vld.h>
int main()
{
int *a = new int[10];
return 0;
}
至关重要的一步,在Release模式下,设置<生成调试信息>选项: 生成经过优化以共享和发布的调试信息(/DEBUG:FULL),只有这一项才能输出泄漏的代码文件和行号,即便选择 "生成调试信息(/DEBUG)"也不行。
在 Debug 模式下运行程序,VLD 会输出内存泄漏报告,其中包含了完整的调用堆栈:
看到了吧,提示第 5 行出现了内存泄漏。
还等什么,抓紧时间解决啦:
#include <vld.h>
int main()
{
int *a = new int[10];
delete[]a;
return 0;
}
再次运行程序,内存泄漏已经不见了: