内存泄露检测工具VLD(Visual Leak Detector)使用说明

目录

一、内存泄漏问题

二、VLD工具使用说明

1 下载VLD

2 安装VLD

3 使用VLD(第一个种方法)

3.1 附加头文件目录

3.2 附加库目录。

4 使用VLD(第二个种方法)

4.1 打包VLD_SDK

4.2 附加头文件目录

4.3 附加库目录。

5 引入vld.h头文件

6 特别需要注意的地方

6.1 执行程序需要以下文件

6.2 使用Debug版本排查问题

7 vld.ini参数设置说明


一、内存泄漏问题

内存泄露是经验不足的程序猿最常遇到的,非常难处理的一类型错误。导致的问题也千奇百怪,很难定位。

最好的办法当然是养成良好的编码习惯,比如声明了指针数据或者指针类之后。

1.优先在对应的构造函数中,赋初值pXXX = nullptr;

2.牢记在指针使用完成之后进行if(e!= nullptr){delete e;  e=nullptr;} 或者if(e!= nullptr){delete []e;e=nullptr;}

3.局部变量问题,在某个函数中new出了指针数据或者指针类,那么请牢记在当前函数退出的任何一个地方,请如2所说,安全删除指针数据或者指针类。

4.尽可能使用vector来代替指针数组,多重指针等。避免出差错的可能性。

但是,如果问题已经积累比较久,还有你可能接手了别人的代码,发现此类问题。那么,可以使用内存泄露检测工具VLD(Visual Leak Detector)来协助排查问题。

二、VLD工具使用说明

1 下载VLD

到GitHub下载最新的VLD程序Release v2.5.1 · KindDragon/vld (github.com)。页面最下方

2 安装VLD

安装到自己喜欢的路径即可,比如D:\Program Files\Visual Leak Detector

3 使用VLD(第一个种方法

3.1 附加头文件目录

因为安装VLD的exe后,系统继承了VLD对应的环境变量路径。

下图中,如果能看到第二个箭头这里,有继承的值,可以直接勾选第三个箭头即可。

3.2 附加库目录。

因为安装VLD的exe后,系统继承了VLD对应的环境变量路径。

下图中,如果能看到第二个箭头这里,有继承的值,可以直接勾选第三个箭头即可。

4 使用VLD(第二个种方法

4.1 打包VLD_SDK

找到VLD安装目录D:\Program Files\Visual Leak Detector提取对应的头文件和库相关文件,打包成VLD_SDK ,如下图

4.2 附加头文件目录

打开VS和想要检测内存泄露问题的项目属性里,增加附加头文件目录。

下图中,如第一个箭头所指。后放到项目中的Lib文件夹下;

4.3 附加库目录。

下图中,如第一个箭头所指,把打包的VLD_SDK库目录添加进来。

5 引入vld.h头文件

找到程序入口的函数处,增加一行代码,导入头文件#include "vld.h",编译程序并运行。

测试程序如下:

#include "stdafx.h"
#include <iostream>
#include "vld.h"


void test()
{
    char* pChar = new char[20];
    //delete[] pChar;
    return;
}


int _tmain(int argc, _TCHAR* argv[])
{
    test();
    return 0;
}

那么我们可以看到VLD在VS输出窗口输出的内容。

-------------------------华丽的分割线-------------------------------------------

Visual Leak Detector Version 2.5.1 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x00552290: 20 bytes ----------
  Call Stack:
    e:\test\consoleapplication1\consoleapplication1\consoleapplication1.cpp (10): ConsoleApplication1.exe!test + 0x7 bytes
    e:\test\consoleapplication1\consoleapplication1\consoleapplication1.cpp (18): ConsoleApplication1.exe!wmain
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (533): ConsoleApplication1.exe!__tmainCRTStartup + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (377): ConsoleApplication1.exe!wmainCRTStartup
    0x7507336A (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes
    0x770F92B2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes
    0x770F9285 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD                                                  ........ ........


Visual Leak Detector detected 1 memory leak (56 bytes).
Largest number used: 56 bytes.
Total allocations: 56 bytes.
Visual Leak Detector is now exiting.

--------------------------------------------------------------------------

双击vld提示的内存泄漏的行号信息,那么我们就可以直接定位到有内存泄漏的地方。

6 特别需要注意的地方

6.1 执行程序需要以下文件

引入vld.h的头文件之后,需要在执行程序exe目录下,放入以下文件,否则程序无法正常启动。

6.2 使用Debug版本排查问题

只有Debug模式和排查内存泄露问题,在程序正常关闭之后,会打印相关的泄露信息。

7 vld.ini参数设置说明

默认读取的是安装目录下的vld.ini 文件,当exe所在目录下也有vld.ini文件时会优先读取这份配置。

VLD:选择VLD的打开与关闭。在Debug模式下运行,关闭以后会有一行VLD关闭的提示信息。默认为 on。

AggregateDuplicates:设置为 yes 时,相同地方产生内存泄漏只输出一次,但是会统计发生的次数。默认是 no 。

MaxDataDump:输出的dump数据个数,默认为 256。

MaxTraceFrames:输出的调用栈的层数。默认是 64。

ReportEncoding :report 文件的编码格式,可选有 ascii, unicode,默认是 ascii 。

ReportFile :report 文件的路径。默认是 “.\memory_leak_report.txt”

ReportTo :可选有 debugger, file, both,debugger 表示输出到 debug模式下的输出窗口;file 表示只输出到文件中; both顾名思义,全都都输出。默认是 debugger 。

备注:怎么让VLD的文件输出到一个独立的文件中?

答:配置 ReportFile = .\你的程序名称_vldLog.txt 和 ReportTo = both 即可。

  • 9
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

devilthelover

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值