检测内存泄露

作者: admin 分类: C++ 发布时间: 2013-12-25 16:30 ė2,414 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

程序结束时,操作系统会回收程序占用的资源.但是,只要程序还在运行,如果不进行清理,资源最终可能被耗尽.

1.VC内存泄露检查工具:Visual Leak Detector

首先从网站上下载1.0版本的zip包,解压之后得到vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdll.lib, dbghelp.dll等文件。将.h文件拷贝到Visual C++的默认include目录下,将.lib文件拷贝到Visual C++的默认lib目录下,便安装完成了。因为版本问题,如果使用windows 2000或者以前的版本,需要将dbghelp.dll拷贝到你的程序的运行目录下,或其他可以引用到的目录。
接下来需要将其加入到自己的代码中。方法很简单,只要在包含入口函数的.cpp文件中包含vld.h就可以。如果这个cpp文件包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。

现在已知的最新有2.0版本的,使方法不详。

http://dev.firnow.com/course/3_program/vc/vc_js/20100710/395070.html

 

下载

http://www.codeproject.com/KB/applications/visualleakdetector.aspx

http://vld.codeplex.com/

 

使用 Visual Leak Detector 2.2.3

下载vld-2.2.3-setup.exe

在vs工程的linker\input\Additional Dependencies中配置vld.lib

在linker\General\Additional Library Directories中配置C:\Program Files (x86)\Visual Leak Detector\lib\Win32

在系统path中添加C:\Program Files (x86)\Visual Leak Detector\bin\Win32

在代码中

#ifdef _DEBUG
#include “vld.h”
#endif

 

使用Visual Leak Detector(1.0)

下面让我们来介绍如何使用这个小巧的工具。

首先从网站上下载zip包,解压之后得到vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdll.lib, dbghelp.dll等文件。将.h文件拷贝到Visual C++的默认include目录下,将.lib文件拷贝到Visual C++的默认lib目录下,便安装完成了。因为版本问题,如果使用windows 2000或者以前的版本,需要将dbghelp.dll拷贝到你的程序的运行目录下,或其他可以引用到的目录。

接下来需要将其加入到自己的代码中。方法很简单,只要在包含入口函数的.cpp文件中包含vld.h就可以。如果这个cpp文件包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。如下是一个示例程序:

#include <vld.h>

void main()

{

}

接下来让我们来演示如何使用Visual Leak Detector检测内存泄漏。下面是一个简单的程序,用new分配了一个int大小的堆内存,并没有释放。其申请的内存地址用printf输出到屏幕上。

#include <vld.h>

#include <stdlib.h>

#include <stdio.h>

 

void f()

{

int *p = new int(0×12345678);

printf(“p=%08x, “, p);

}

 

void main()

{

f();

}

编译运行后,在标准输出窗口得到:

p=003a89c0

 

在Visual C++的Output窗口得到:

 

WARNING: Visual Leak Detector detected memory leaks!

———- Block 57 at 0x003A89C0: 4 bytes ———- –57号块0x003A89C0地址泄漏了4个字节

Call Stack:                                               –下面是调用堆栈

d:\test\testvldconsole\testvldconsole\main.cpp (7): f –表示在main.cpp第7行的f()函数

d:\test\testvldconsole\testvldconsole\main.cpp (14): main –双击以引导至对应代码处

f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (586): __tmainCRTStartup

f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): mainCRTStartup

0x7C816D4F (File and line number not available): RegisterWaitForInputIdle

Data:                                   –这是泄漏内存的内容,0×12345678

78 56 34 12                                                  xV4….. ……..

 

Visual Leak Detector detected 1 memory leak.

第二行表示57号块有4字节的内存泄漏,地址为0x003A89C0,根据程序控制台的输出,可以知道,该地址为指针p。程序的第7行,f()函数里,在该地址处分配了4字节的堆内存空间,并赋值为0×12345678,这样在报告中,我们看到了这4字节同样的内容。

可以看出,对于每一个内存泄漏,这个报告列出了它的泄漏点、长度、分配该内存时的调用堆栈、和泄露内存的内容(分别以16进制和文本格式列出)。双击该堆栈报告的某一行,会自动在代码编辑器中跳到其所指文件的对应行。这些信息对于我们查找内存泄露将有很大的帮助。

这是一个很方便易用的工具,安装后每次使用时,仅仅需要将它头文件包含进来重新build就可以。而且,该工具仅在build Debug版的时候会连接到你的程序中,如果build Release版,该工具不会对你的程序产生任何性能等方面影响。所以尽可以将其头文件一直包含在你的源代码中。



只回答业务咨询点击这里给我发消息 点击这里给我发消息

学习日记,兼职软件设计,软件修改,毕业设计。

本文出自 学习日记,转载时请注明出处及相应链接。

本文永久链接: https://www.softwareace.cn/?p=669

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量