qt5使用内存检测工具vld查看内存泄漏

什么是vld?

Visual Leak Detector是一款用于Visual C++的免费的内存泄露检测工具。相比较其它的内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点:
  1、 可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号;
  2、 可以得到泄露内存的完整数据;
  3、 可以设置内存泄露报告的级别;
  4、 它是一个已经打包的lib,使用时无须编译它的源代码。而对于使用者自己的代码,也只需要做很小的改动;
  5、 他的源代码使用GNU许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。

从使用角度来讲,Visual Leak Detector简单易用,对于使用者自己的代码,唯一的修改是#include Visual Leak Detector的头文件后正常运行自己的程序,就可以发现内存问题。从研究的角度来讲,如果深入Visual Leak Detector源代码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。

qt5如何使用vld查看内存泄漏?

1、确保调试器使用的是MSVC2015 32而不是minGW 32.更改教程可查看链接:https://blog.csdn.net/youarenotme/article/details/107444429;
2、下载VLD,下载地址:https://kinddragon.github.io/vld/;
3、安装VLD后,将“vld安装目录/include”下的vld.h文件拷贝到Qt默认的include目录下,将“vld安装目录/lib/Win64"下的vld.lib拷贝到Qt默认的lib目录,就完成安装了;
4、修改要测试项目的main.cpp文件,在main函数上面添加以下代码:
include<vld.h>
5、在realease模式下(一定要在realease模式下运行,否则无法查看到内存泄漏的具体代码行,具体原因暂未查到)运行程序,确保要检查的代码块被执行后,正常关闭程序;
6、在“应用程序输出”窗口查看检查结果。若结果中有“No memory leaks detected.”则表示无内存泄漏。

VLD一些有用的选项

VLD提供了一些配置项,可以通过vld.ini设置,默认情况将使用安装目录下的vld.ini,也可以将vld.ini拷贝到程序运行目录,这样仅当运行该程序时生效。
MaxTraceFrames:输出的堆栈级数限制

AggregateDuplicates:若为"yes",则只在报告中输出特定泄漏位置的第一次泄漏

MaxDataDump:转储数据大小限制

ReportTo:内存泄漏报告的输出形式,可以使用"debugger"、 "file"或者 “both”

ReportFile:内存泄漏报告的文件名,默认"memoryleakreport.txt"

VLD实现原理

Vld通过修改IAT表将crt的调用替换为自己的实现,并记录分配时的调用堆栈,相比通过宏替换new/delete、malloc/free,具有以下好处:

1、无需编译时对每个c/c++文件都包含指定头文件

2、可以运行时控制内存泄漏检查策略

3、具有很好的扩展性,例如支持vc11引入的_aligned_malloc

以上思路可用于检查其他泄漏,例如用户对象泄漏、GDI泄漏、句柄泄漏等

猜你喜欢

转载自blog.csdn.net/youarenotme/article/details/107896486