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

2023-11-15

一、内存泄漏

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

  1. 需要在 Debug 模式下使用。如果是 Release 模式,则不会链接 VLD。
  2. 只能使用 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual C++ 内存泄露检测工具(VLD) 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • 【JAVA】 String 方法附件

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 String 方法 String 方法 char charAt int index 返回指定索引处的 char 值 int compareTo Object o 把这个字符串和另一个对象
  • 详解ReentrantLock---可重入锁(小白易懂)

    详解ReentrantLock 小白易懂 初识ReentrantLock ReentrantLock是可重入的互斥锁 虽然具有与synchronized相同功能 但是会比synchronized更加灵活 具有更多的方法 ReentrantL
  • linux网卡bond模式检查,linux 查看bond状态

    SCC 超级计算集群 简介 SCC概述 超级计算集群 Super Computing Cluster SCC 使用高速RDMA网络互联的CPU以及GPU等异构加速设备 面向高性能计算 人工智能 机器学习 科学 工程计算 数据分析 音视频处理
  • Keil MDK5勾选Reset and Run下载固件仍然不自动运行的解决办法

    解决方法 把pack里面的ENABLE 取消掉就好了
  • 一个测试工程师的七年感悟——致在一路独行的你(别放弃)

    前言 不知不觉在软件测试行业 摸爬滚打了7年之久 这一路上也留下了许许多多令我难以忘记的故事 有刚入行时的迷茫 有学习技术路上踩过的坑 有做项目连夜敲代码的悲情也有迎来项目成功上线的欢愉 有太多太多值得铭记的瞬间 这一切只源于我走了测试这条
  • Open Judge 1.4 09

    09 判断能否被3 5 7整除 总时间限制 1000ms 内存限制 65536kB 描述 给定一个整数 判断它能否被3 5 7整除 并输出以下信息 1 能同时被3 5 7整除 直接输出3 5 7 每个数中间一个空格 2 只能被其中两个数整除
  • ​金蝶云星空管理中心反序列化RCE漏洞复现 附POC

    文章目录 金蝶云星空管理中心反序列化RCE漏洞复现 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 访问漏洞环境 2 构造POC 3 复现 4 进行ipconfig命令测试 0x06修复建
  • 一些好的博客或者论坛,可以经常浏览

    1 博客 果冻想 常用一些技术的总结和系列化的学习 http www jellythink com 2 类似博客 mikewootc的分享空间 首页 http www mikewootc com wiki net protocol rtsp
  • UVa 11464 Even Parity 题解

    这是一道白书17页的题目 题目大意 输入一个n n的01矩阵 1
  • java 远程调试 端口_JAVA远程调试

    1 远程端启动必须添加jvm参数 Xdebug Xrunjdwp transport dt socket suspend n server y address debug port 其中debug port为自定义的调试端口 2 本地连接远
  • 短沟道效应 & 窄宽度效应 short channel effects & narrow width effects

    文章目录 1 概念 Narrow Width Effect 窄宽度效应 Short Channel effects 短沟道效应 阈值电压 Threshold voltage 2 阈值电压与沟道长和沟道宽的关系 Narrow channel
  • ATT&CK实战系列——红队实战(一)完整版

    前言 今天有大佬位推荐了这个靶场 然后就去了解了一下非常贴近实战 下载开干 靶场的描述 红队实战系列 主要以真实企业环境为实例搭建一系列靶场 通过练习 视频教程 博客三位一体学习 另外本次实战完全模拟ATT CK攻击链路进行搭建 开成完整闭
  • linux的jstack,jmap命令的正确安装附详细教程

    先执行命令 yum list showduplicate su root yum list showduplicate grep i java yum install java 11 openjdk devel x86 64 y jstac
  • 吃货联盟订餐系统项目----面向对象思路

    吃货联盟订餐系统项目 面向对象思路 思路 首先可以划分出四个类 菜单类 订单类 饭店类 测试类 菜单类中 需要用到菜单编号 菜单名称 菜单价格 点赞数四个属性 并根据这些属性创建一个带参构造以及getter setter方法 订单类中 需要
  • 生命在于折腾——SQL注入的实操(三)less11-15

    一 实操环境 1 操作系统 VMware虚拟机创建的win10系统 内存8GB 硬盘255GB 处理器AMD Ryzen 9 5900HX 2 操作项目 sql lib项目 本篇文章介绍关卡11 15 3 工具版本 phpstudy 8 1
  • 什么是node,node怎么用?

    Node js 是一个基于Chrome V8 引擎的JavaScript运行环境 Node js使用了一个事件驱动 非阻塞式I O的模型 使其轻量又高效 事件驱动 任务执行 发布者 订阅者 事件驱动 on emit 非阻塞 执行某一个任务的
  • 2021斯坦福CS224N课程笔记~3

    3 神经网络学习 手工计算梯度 Lecture 3 Neural net learning Gradients by hand matrix calculus and algorithmically the backpropagation
  • git拉取和推送如何指定远程服务器的ssh端口

    家里弄了个嵌入式服务器 里面安装了git 申请了动态公网ip 上行速度40Mbps 可比国内的服务器带宽大多了 所以要好好利用起来 但是由于是动态公网ip 因此做了端口映射 指定端口9999到嵌入式服务器的22端口 如何让git push
  • 劢领AT

    劢领AT 五分钟 一条指令设置WIFI模块直接连接MQTT服务器或者阿里云物联网平台 超级指令诞生缘由 超级指令详解 一 阿里云物联网套件超级指令 AT SAC 1 指令说明 2 指令示例 二 MQTT服务器超级指令 AT SMC 1 指令
  • Visual C++ 内存泄露检测工具(VLD)

    一 内存泄漏 1 什么是内存泄露 由于疏忽或者错误 异常安全 导致程序未能释放已经不再使用的内存的情况 内存泄露并非是指内存在物理上的消失 而是指程序失去了对该内存的控制 导致的资源浪费 2 内存泄露的分类 a 堆内存泄露 Heap Lea