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