Visual C++内存泄露检测工具(VLD)
时间:2022-05-04
本文章向大家介绍Visual C++内存泄露检测工具(VLD),主要内容包括简述、VLD、下载、安装、使用、Qt、更多参考、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
简述
C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的 - 从性能下降到内存耗尽,甚至会影响其他程序的正常运行。
VLD
VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。相比较其它内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点:
- 可以得到内存泄漏点的调用堆栈,如果可以的话,还能得到其所在文件及行号;
- 可以得到泄露内存的完整数据;
- 可以设置内存泄露报告的级别;
- 它是一个已经打包的 lib,使用时无须编译源码。对于使用者自己的代码,只需要做很小的改动;
- 源码使用 GNU 许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。
可见,VLD 简单易用。只需要做很小的改动(添加库并包含头文件),然后正常运行自己的程序,就可以发现内存问题;如果深入源码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。
下载、安装
VLD 主页:http://vld.codeplex.com/
进入主页后,点击【download】按钮进行下载 VLD 最新版本,或者在“DOWNLOADS”页面查找其它更多版本。
下载完成后,进行安装(傻瓜式 - 下一步)。
安装后的文件夹中主要包括:
- bin:包含 dbghelp.dll、vld_x86.dll 文件
- include:包含 vld.h、vld_def.h 文件
- lib:包含 vld.lib 文件
使用
Visual Studio
新建一个 Win32 控制台应用程序,添加如下代码:
#include "stdafx.h"
#include "vld.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *pBuf = new char[200];
return 0;
}
配置项目:
- C/C++ -> 常规 -> 附加包含目录:
D:Program FilesVisual Leak Detectorinclude
- 链接 -> 常规 -> 附加库目录:
D:Program FilesVisual Leak DetectorlibWin32
在 Debug 模式下运行,将会输出如下信息:
报告列出了内存泄露是在第几块、所在的地址、泄露的字节、调用的堆栈、内存内容。双击调用堆栈可以跳转到所在行。
Qt
新建一个 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++)编译程序。
更多参考
- 用 Python 来刷微信「跳一跳」游戏的记录
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化
- 高吞吐koa日志中间件
- 关于SQLRecoverableException问题的排查和分析(r4笔记第13天)
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
- node中的Stream-Readable和Writeable解读
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(六)一定要RESTful吗?
- 深入node之Transform
- 巧用shell脚本统计磁盘使用情况(r4笔记第12天)
- 使用fasttext实现文本处理及文本预测
- 关于导入导出sequence(r4笔记第11天)
- Spring+SpringMVC+MyBatis整合进阶篇(四)RESTful实战(前端代码修改)
- Nodejs cluster模块深入探究
- org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法