转载:C/C++检测内存泄漏的工具 vld Visual Leak Detector223 的使用方法和sample示例

时间:2023-03-09 17:05:41
转载:C/C++检测内存泄漏的工具 vld Visual Leak Detector223 的使用方法和sample示例

这类的工具有 比如 :LeakDiag leakfinder "Visual Leak Detector"  

vld可以从http://vld.codeplex.com/releases/view/82311 现在最新版本,包括src源代码。

安装好以后,他会提示 要求添加 dll 到环境变量中去。

使用 vld 的方法为:在自己的代码中 添加 vld 的头文件,以及 lib 声明,其会自动去环境变量path中搜索 vld_x86.dll 或vld_x64.dll ,然后 调用其中的方法的。

头文件有俩:vld_def.h 和 vld.h,只需要包含后者(其会包含前者的)

这 vld 并没有提供sample,提供的src源代码 也只是 编译成 dll的。

于是 我自己写了一个工程vldTest(用 vs2010 建立 console的 普通 的win32 程序)

下面就是测试的代码,lib和h文件 的路径 你自己看着办就行。vld.h里面也有 这个 包括 pragma lib的,注释掉 或者  将 lib添加到 path 还是 Library_Path什么环境变量中去。

下面的代码 功能是 写一个 内存泄漏 的程序,说白了,就是分配内存,但是没有释放掉。虽然程序结束会释放掉,但是如果不结束 一直 不释放的,就是内存泄漏了。下面程序 有2个内存泄漏,但是 vld 检测是3个。对了 编写成 DEBUG模式,才会启用 vld的功能。原因 看 vld.h的条件编译。

// vldTest.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "..\include\vld.h" #pragma comment(lib,"../lib/Win32/vld.lib") class MyTest
{
public:
MyTest(const char *szName)
{
// The following is the second resulting leak
m_pszName = strdup(szName);
}
~MyTest()
{
if (m_pszName != NULL)
free(m_pszName);
m_pszName = NULL;
}
protected:
char *m_pszName;
}; int _tmain(int argc, _TCHAR* argv[])
{
int * ptrInt;
ptrInt=(int*)malloc();
memset(ptrInt,0xed,);
printf("0x%08x\n",*ptrInt);
//VLDEnable();
//VLDRestore();
//VLDGlobalEnable(); // This is the "main" leak
MyTest *pTest = new MyTest("This is an example");
//VLDReportLeaks();
//VLDGetLeaksCount (); return ;
}

运行效果如图:(为了显示全部,去掉了MyTest 那句话)。

转载:C/C++检测内存泄漏的工具 vld Visual Leak Detector223 的使用方法和sample示例

如果 加上 free(ptrInt); 就没有泄漏了。如图

转载:C/C++检测内存泄漏的工具 vld Visual Leak Detector223 的使用方法和sample示例

除了 0xedededed 这句话 其他都是 vld 的输出。如果发布成 release,默认 不会 调用 vld了。

程序参考了

http://topic.csdn.net/t/20021216/13/1265024.html

http://www.codeproject.com/Articles/3134/Memory-Leak-and-Exception-Trace-CRT-and-COM-Leaks