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

一.      内存泄漏的危害

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

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

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

内存泄露最明显最直接的影响就是导致系统中可用的内存越来越少。直到所有的可用内存用完最后导致系统无可用内存而崩溃。

如果导致泄露的操作是一次性的,或是不经常的,一般问题都不大。在应用退出或系统退出时会清理内存;

如果导致泄露的操作是经常性的或是循环的,则内存会最终消耗完(或很短时间内)而导致系统崩溃。

内存在由程序申请后按理说应该在不使用的时候合理的释放掉,泄露就是在被申请的内存不在使用的时候一直未被回收,从而导致该块内存永不会再被使用而导致可用内存被耗光。

二.      如何排查内存泄漏

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

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

3)      其他静态扫描工具

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

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

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

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.      使用智能指针来管理堆内存的申请与释放

示例代码请从此下载:

欢迎大家补充!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值