Visual C++ 内存泄露检测工具(VLD)
一、内存泄漏
1、什么是内存泄露
由于疏忽或者错误(异常安全)导致程序未能释放已经不再使用的内存的情况。内存泄露并非是指内存在物理上的消失,而是指程序失去了对该内存的控制,导致的资源浪费。
2 、内存泄露的分类
a、堆内存泄露(Heap Leak)
通过malloc,realloc,new等方式从堆中分配的内存,并且完成后必须通过调用对应的free,delete 释放。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak。
b、系统资源泄露(Resource Leak)
使用系统分配的资源比如 :Bitmap,SOCKET 等没有使用相应的函数释放掉。导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。
3、内存泄露的危害
a、如果申请的内存没有释放,随着进程的正常结束,则这个内存会被自动释放。
b、长期运行的程序遇到内存泄漏的问题,危害就非常的大。比如:操作系统、服务器,这些程序长期运行,若遇到内存泄露的问题会导致可用的内存越来越少,某些服务的操作失败(打开文件、创建套接字、发送数据)。
二、VLD简述
VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。相比较其它内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点:
- 可以得到内存泄漏点的调用堆栈,如果可以的话,还能得到其所在文件及行号;
- 可以得到泄露内存的完整数据; 可以设置内存泄露报告的级别;
- 它是一个已经打包的 lib,使用时无须编译源码。对于使用者自己的代码,只需要做很小的改动;
- 源码使用 GNU许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。
可见,VLD 简单易用。只需要做很小的改动(添加库并包含头文件),然后正常运行自己的程序,就可以发现内存问题;如果深入源码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。
若为Linux环境强烈推荐使用Valgrind
推荐文章:
内存泄漏检测工具valgrind神器
C++内存泄漏检查工具——Valgrind(–tool = memcheck)
三、VLD内存泄漏检测原理
1、Visual Leak Detector在Debug使用malloc,realloc,new等方式从堆中分配的内存,会在内存块的头中记录分配该内存的文件名及行号。当程序退出时CRT会在main()函数返回之后做一些清理工作,这个时候来检查调试堆内存,如果仍然有内存没有被释放,则一定是存在内存泄漏。从这些没有被释放的内存块的头中,就可以获得文件名及行号,并将其转换成报告输出。
2、Visual Leak Detector将其初始化设置在compiler段,从而使得它在绝大多数全局变量和几乎所有的用户定义的全局变量之前初始化。
四、下载、安装
CSDN下载:https://download.csdn.net/download/qq_43148810/34865979
Visual Leak Detector官网、下载:https://kinddragon.github.io/vld/
进入主页后,点击【Download Installer】按钮进行下载 VLD 最新版本。
下载完成解压安装即可。
安装目录下有:
- bin(32位和64位的dll和pdb文件,以及Microsoft.DTfW.DHL.manifest文件)文件夹
- inclode(vld.h和vld_def.h头文件)文件夹
- lib(32位和64位的vld.lib)文件夹
- vld.ini(配置)文件
五、Visual Studio中使用
1、配置项目:
四步骤中软件安装已为VS2008-2015所有项目设置了【C/C++——常规——附加包含目录】:C:\Program Files (x86)\Visual Leak Detector\include,以及【链接器——常规——附加库目录】:C:\Program Files (x86)\Visual Leak Detector\lib\Win64(Win32)。
- 项目代码中可直接#include"vld.h";
- 【链接器——输入——附加依赖项】中添加vld.lib;
- 安装目录Bin文件夹的对应版本文件夹(Win32或Win64)所有文件拷贝至输出目录。
2、测试工程代码
#include <iostream>
#include "vld.h"
int main(int argc, char* argv[])
{
char *pBuf = new char[200];
return 0;
}
运行完成后查看控制台输出或者VS的输出窗口。
报告列出了内存泄露是在第几块、所在的地址、泄露的字节、调用的堆栈、内存内容。双击调用堆栈可以跳转到所在行。
六、Qt中使用
1、新建一个 Qt Console Application,在 .pro 文件中添加如下内容
# 只有在 Win32 下才可使用
win32 {
CONFIG(debug, debug|release) { # 需要基于 Debug 模式
DEFINES += VLD_MODULE
VLD_PATH = "D:/Program Files/Visual Leak Detector"
INCLUDEPATH += $${VLD_PATH}/include
LIBS += -L$${VLD_PATH}/lib/Win32 -lvld
}
}
main.cpp 文件如下所示:
#include <QCoreApplication>
// 添加 VLD 头文件
#ifdef VLD_MODULE
#include "vld.h"
#endif
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char *pBuf = new char[200];
return a.exec();
}
编译运行,在 Qt Creator 的应用程序输出窗口中将会出现和 Visual Studio 中类似的内存泄露信息。
使用 VLD 检测内存泄露很容易,但在使用过程中,需要注意以下几点:
- 需要在 Debug 模式下使用。如果是 Release 模式,则不会链接 VLD。
- 只能使用 VC++编译器。这也是美中不足的一点,如果使用 Qt,只能先使用 VC++ 编译器捕捉并解决内存泄露,再考虑使用mingw(gcc/g++)编译程序。
Visual Leak Detector官网、下载:https://kinddragon.github.io/vld/
相关文章推荐:https://waleon.blog.csdn.net/article/details/52789085
https://blog.csdn.net/Outtch_/article/details/108677744
valgrind开源动态分析系统:
内存泄漏检测工具valgrind神器:https://zhuanlan.zhihu.com/p/75416381
Valgrind学习总结:https://blog.csdn.net/andylauren/article/details/93189740
如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810
更多推荐
所有评论(0)