关于使用vld来进行内存泄漏检测的基础知识

一.      内存泄漏的危害

内存泄漏产生的根本原因在于动态申请的内存未及时释放或未正确的释放。

 

1.       耗光内存,程序无法正常工作或崩溃

2.       产生内存碎片,在实际内存够用的情况下,因为没有足够大的连续内存块,而导致程序申请内存失败

内存泄露最明显最直接的影响就是导致系统中可用的内存越来越少。直到所有的可用内存用完最后导致系统无可用内存而崩溃。      
如果导致泄露的操作是一次性的,或是不经常的,一般问题都不大。在应用退出或系统退出时会清理内存;
        如果导致泄露的操作是经常性的或是循环的,则内存会最终消耗完(或很短时间内)而导致系统崩溃。
        内存在由程序申请后按理说应该在不使用的时候合理的释放掉,泄露就是在被申请的内存不在使用的时候一直未被回收,从而导致该块内存永不会再被使用而导致可用内存被耗光。

 

二.      如何排查内存泄漏

1)      VS环境内置的内存泄漏检查 (不便于针对特定场景检测,部分泄漏检测不出来)

2)      使用virtual leak detector来检查内存泄漏

3)      其他静态扫描工具

 

本文主要介绍使用vld来进行内存泄漏检测的相关事项。

http://vld.codeplex.com/

 

VLD支持排查特定线程的泄漏、所有线程的泄漏、在特定的阶段启用泄漏检查,安装非常方便,从网站上下载安装包,安装即可(注意勾选集成到开发环境的选项)

 安装完成后,需要做检测的地方,只要#include<vld.h>,即可启用内存泄漏检测了。

 

VLD支持多样化的检测设置接口,具体如下:

1.       单一线程的内存泄漏排查

1) VLDDisable   禁用当前线程的内存泄漏检测

2) VLDEnable    启用当前线程的内存泄漏检测

3) VLDRestore   还原当前线程的内存泄漏检测设置到上一个状态

利用这个方法,可以做到只检测特定线程的内存泄漏,也可以排除此特定线程的内存泄漏检测。

 

2.       整个程序的内存泄漏排查

1)      VLDGlobalDisable

2)      VLDGlobalEnable

利用这个方法,可以做到只检测特定阶段的内存泄漏,比如程序启动过程中的内存泄漏,不进行检测,只能当程序初始化完成后,再启动检测。

 

3.       针对特定模块来使用内存泄漏排查

1)          VLDEnableModule

2)  VLDDisableModule

 

4.       获取相关的泄漏信息

 

#define VLDReportLeaks() (0)  打印整个程序当前执行此函数前的内存泄漏

#define VLDReportThreadLeaks() (0) 打印特定线程在执行此函数前的内存泄漏

#define VLDGetLeaksCount() (0)      获取整个程序当前的内存泄漏数量

#define VLDGetThreadLeaksCount() (0)  获取指定线程当前的内存泄漏数量

#define VLDMarkAllLeaksAsReported()      标记当前的泄漏为已经报告过,后续不再报告

#define VLDMarkThreadLeaksAsReported(a)  标记指定线程当前的泄漏为已经报告过,后续不再报告

 

5.  其他高级功能

#define VLDRefreshModules()           刷新加载的模块列表,以便针对动态加载的模块进行内存泄漏检查 

#define VLDGetOptions() (0)          获取检测的设置 (不太清楚

#define VLDGetReportFilename(a)      获取泄漏报告生成的文件夹名

#define VLDSetOptions(a, b, c)       设置检测选项

#define VLDSetReportHook(a, b)      自定义的内存泄漏报告回调函数(不清楚

#define VLDSetModulesList(a)        设置要包含或者排除泄漏检测的模块列表

#define VLDGetModulesList(a, b) (FALSE)  获取检测中的模块列表

#define VLDSetReportOptions(a, b)

#define VLDResolveCallstacks() (0)

 

更多信息直接查看官方文档及代码注释。


三. 如何避免内存泄漏

1.      避免堆内存申请

2.      使用智能指针来管理堆内存的申请与释放 


示例代码请从此下载:

http://download.csdn.net/detail/tragicguy/9733473


欢迎大家补充!

vld是一款非常有用的内存检测工具,它可以帮助程序员在开发过程中及时发现和解决内存泄漏的问题。 首先,我们需要在自己的项目中集成VLD。在下载并安装VLD后,我们可以将其作为一个静态库添加到项目中,或者使用命令行方式进行集成。 一旦集成成功,我们可以在程序运行过程中启动VLD进行内存检测。我们可以通过设置不同的环境变量来控制VLD的行为。比如,我们可以指定要检测的代码模块、要忽略的代码模块等。 当程序运行时,VLD会跟踪所有的内存分配和释放操作,并将涉及到的地址、大小和操作类型记录下来。如果存在内存泄漏VLD会将泄漏的内存地址、大小和泄漏次数进行输出。 通过分析VLD输出的信息,我们可以根据内存泄漏的地址和大小去定位问题所在。比如,通过检查内存分配和释放操作之间的关系,我们可以找到造成内存泄漏的具体代码位置。然后,我们可以对泄漏的内存进行释放,修复问题。 除了检测内存泄漏外,VLD还可以检测其他内存错误,如内存访问越界、双重释放等。这些错误同样会导致程序的崩溃或者不可预料的行为,所以检测并修复它们也非常重要。 总之,VLD是一款非常实用的内存检测工具,它可以帮助我们在开发过程中更早地发现和解决内存泄漏和其他内存错误问题,提高程序的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值