VLD(Visual LeakDetector)内存泄露库的简单使用

vld下载http://vld.codeplex.com/ http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

安装的时候会有让你选择是否加载库和头文件目录,选择了就不需要手动添加

手动添加:打开Visual C++ IDE的"工具"→"选项"→"项目和解决方案"→"VC++ 目录",在"包含文件"中增加VLD的头文件路径"include"路径,在"连接器_------>常规——>附加库目录"增加VLD库文件的"libWin32"路径

将VLD加入到自己的代码中。方法很简单,包含vld.h就可以使用vld

#include<string>
#include<sstream>
#include<vector>
#include<algorithm>  
#include<iostream>
#include "vld.h"
using namespace std;
void testNew()
{
	char *data = new char[100];
	data[0] = a;
	cout << data[0];
}
void testNewWithDelete()
{
	char *data1 = new char[100];
	data1[0] = b;
	cout << data1[0];
	delete[] data1;
	data1 = NULL;
}
int main()
{
		testNew();
		return 0;
}

运行结果

报告列出了内存泄露是在第几块,所在的地址,泄露的字节,调用的堆栈,内存内容。双击调用堆栈可以跳转到所在行。 报告列出了内存泄露是在第几块,所在的地址,泄露的字节,调用的堆栈,内存内容。双击调用堆栈可以跳转到所在行。
注意点:在Release模式下,不会链接Visual Leak Detector。 注意点:在Release模式下,不会链接Visual Leak Detector。
Visual Leak Detector有一些配置项,可以设置内存泄露报告的保存地(文件、调试器),拷贝"Visual Leak Detector"路径下的vld.ini文件到工程的Debug目录下(在IDE运行的话,则需要拷贝到工程目录下),修改以下项: Visual Leak Detector有一些配置项,可以设置内存泄露报告的保存地(文件、调试器),拷贝"Visual Leak Detector"路径下的vld.ini文件到工程的Debug目录下(在IDE运行的话,则需要拷贝到工程目录下),修改以下项:
ReportFile = name.txt 
ReportTo = both ReportFile = name.txt ReportTo = both

VLD工具原理

下面我们来看看VLD是如何工作的。在VisualC++中内置工具CRT Debug Heap工具,在使用Debug版本分配内存时,它会在内存块中记录分配该内存的文件名和行号。当程序退出时CRT会在main函数返回时做一些清理工作,此时检查调试堆内存,如果仍然有内存没释放,则一定存在内存泄漏问题。从这些没有被释放的内存块的头中可以得到文件名和行号。这种静态的方法可以检查出内存泄漏,但是不知道泄漏究竟是怎么发生的,也不知道该内存分配语句是如何被执行到的,想要了解这些必须对内存分配过程进行动态跟踪。VLD就是这样做的,在每次内存分配的时候记录其上下文,当程序退出时对检测到的内存泄漏查找其上下文信息,并转换成报告输出到调试窗口中

经验分享 程序员 微信小程序 职场和发展