Visual C++内存泄露检测工具(VLD)

简述

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 Files\Visual Leak Detector\include
  • 链接 -> 常规 -> 附加库目录:D:\Program Files\Visual Leak Detector\lib\Win32

在 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 检测内存泄露很容易,但在使用过程中,需要注意以下几点:

  1. 需要在 Debug 模式下使用。如果是 Release 模式,则不会链接 VLD。
  2. 只能使用 VC++ 编译器。这也是美中不足的一点,如果使用 Qt,只能先使用 VC++ 编译器捕捉并解决内存泄露,再考虑使用 mingw(gcc/g++)编译程序。

更多参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

通过ProGet搭建一个内部的Nuget服务器

.NET Core项目完全使用Nuget 管理组件之间的依赖关系,Nuget已经成为.NET 生态系统中不可或缺的一个组件,从项目角度,将项目中各种组件的引用统...

23310
来自专栏Hellovass 的博客

真·Android Studio 代理设置指南

shadowsocks 在 windows 上是支持 socks 代理和 http 代理,但在 OSX 上只是支持 socks5 代理,属于局部代理。Andro...

1654
来自专栏24K纯开源

Premiere Pro & After Effects插件开发调试方法

      在给Adobe Premiere Pro(PR)和Adobe After Effects(AE)插件开发时,对于实时调试插件有着很强的需求。除了业务...

2417
来自专栏张善友的专栏

ASP.NET 5运行时升级到Beta5

在Visual Studio 2015 RTM和Windows 10正式发布之前,微软把开源.NET升级到了beta5,带来了一些增强和改变。和Visual S...

2048
来自专栏CodingToDie

每日推荐

你的桌面还杂乱无章吗?你还在为苦苦搜寻一个文件而劳心费力吗?你还在桌面上建快捷方式吗? 有了它,以上都不是问题.

812
来自专栏伪君子的梦呓

优雅地使用 PyCharm

0.0 前言 昨天教了大家安装和使用PyCharm 后,有朋友留言说 PyCharm 使用的语言是英文,看得头晕,该怎么设置成中文。那我今天就写一个教程,教大...

6515
来自专栏数值分析与有限元编程

VS2017作为python开发的IDE

在VS这一款号称“宇宙最强”的IDE和编译器中,高度集成了对python语言的支持,并直接加入了机器学习的框架,只需要在安装的时候选择python模块就行(可以...

2.5K1
来自专栏张善友的专栏

ASP.NET2.0应用中定制安全凭证

阅读提要 在缺省状况下,你只能使用Visual Studio 2005的一个本机实例来管理与ASP.NET 2.0一同发行的SQL Server数据库中的安全凭...

1889
来自专栏mwangblog

开始使用vim

1445
来自专栏乐沙弥的世界

Vmware server 下为Oracle RAC 添加共享磁盘

    在VMware下的Oracle RAC 环境中,对于共享存储不够或者需要增加新的共享磁盘来配置ocr或votingdisk的多路镜像,我们可以通过vmw...

1351

扫码关注云+社区