背景
在实际的项目实践中,随着程序越复杂,内存管理就显得越重要。虽然有许多方法可以防止内存泄露,但在实践中还是难免出现内存泄露的情况,并且内存泄露问题很难被发现和定位其位置。
VLD
Visual Leak Detector 是一款用于 C++ 的免费内存泄露检测工具,并且它在检测到内存泄露的同时还可以得到内存泄露时的调用堆栈以及所在文件和行号。
Visual Leak Detector下载地址:
VLD 主页:https://kinddragon.github.io/vld/
文档地址:https://github.com/KindDragon/vld/wiki
GitHub 地址:https://github.com/KindDragon/vld
VLD 的使用
①.安装
从主页下载安装包后直接默认安装即可;也可以下载源码编译生成库文件使用。
②.目录说明
VLD 安装后的目录如下所示:
bin:包含了运行时的库文件 - dbghelp.dll、vld_x64.dll
include:包含了编译时要用到的头文件 - vld.h、vld_def.h
lib:包含了编译时要用到的库文件 - vld.lib
vld.ini:vld 的配置文件,可以将其拷贝到程序运行目录,以仅对该程序时生效
③.项目配置
需要在项目属性中配置 vld 头文件及库文件路径:
附加包含目录:C:\Program Files (x86)\Visual Leak Detector\include
附加库目录:C:\Program Files (x86)\Visual Leak Detector\lib\Win32
附加依赖项:vld.lib
④.拷贝动态库
把 bin 中的相关文件拷贝到项目的运行目录中:
⑤.程序运行
在项目的 main.cpp 文件中添加头文件:include<vld.h>。然后在 Debug 模式下运行程序,VLD 会输出内存泄漏报告,其中包含了完整的调用堆栈。
⑥.VLD 配置文件说明
配置文件中关键参数:
MaxTraceFrames:输出的堆栈级数限制
AggregateDuplicates:若为"yes",则只在报告中输出特定泄漏位置的第一次泄漏
MaxDataDump:转储数据大小限制
ReportTo:内存泄漏报告的输出形式,可以使用"debugger"、 "file"或者 “both”
ReportFile:内存泄漏报告的文件名,默认"memoryleakreport.txt"
应用示例
①.内存泄漏代码
#include "vld.h"
int main()
{
int *p = new int(20);
return 0;
}
②.代码运行
如上图所示,vld 检测出内存泄露时的调用堆栈及所在行号,双击即可定位到代码目录。
③.报告分析
报告中包含了几个内容:
【Block X at …: Y bytes】第 X 个块(new)泄漏了 Y 个字节;
【Call Stack】泄漏内存的堆栈信息,双击对应的行可以跳到具体代码位置;
【Data】泄漏内存的数据信息;
【Visual Leak Detector detected X memory leak (Y bytes).】总共 X 处泄漏,共泄漏字节数 Y 字节;
④.修改代码
定位内存泄漏代码并修改代码后:
注意事项
工程目录中不能包含中文,否则 vld 将不能显示调用堆栈信息,如下图所示: