转载: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(10);
    memset(ptrInt,0xed,10);
    printf("0x%08x\n",*ptrInt);
    //VLDEnable();
    //VLDRestore();
    //VLDGlobalEnable();
    

    // This is the "main" leak
    MyTest *pTest = new MyTest("This is an example");
    //VLDReportLeaks();
    //VLDGetLeaksCount ();
    

    return 0;
}

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

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

除了 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

 

posted on 2013-07-24 09:45  sunws_king  阅读(284)  评论(0)    收藏  举报

导航