当前位置: 首页 > news >正文

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

一、内存泄漏

1、什么是内存泄露(Memory Leak

由于疏忽或者错误(异常安全)导致程序未能释放已经不再使用的内存的情况。内存泄漏并非是指内存在物理上的消失,而是指程序失去了对该内存的控制,导致的资源浪费。

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文件)文件夹
  • include(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

转自:Visual C++ 内存泄露检测工具(VLD)_大胡子的艾娃的博客-CSDN博客_vs内存泄漏检测工具

相关文章:

  • 堆溢出崩溃分析Critical error detected c0000374
  • C++中内存泄漏,内存溢出区别及检查方法
  • [win10] ffmpeg gpu加速
  • Qt/null 空指针的一些操作规则
  • FFmpeg H264编码
  • 图像锐化是什么
  • FFmpeg原始帧处理-滤镜API用法详解
  • ffmpeg中的rtbufsize
  • 智能指针的实现
  • 什么是构造函数和析构函数?
  • CD-ROM
  • 光盘文件格式-udf、iso9660、Joliet、Romeo
  • 刻录光盘的程序步骤
  • ISO文件
  • DVD-数字通用光盘
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【comparator, comparable】小总结
  • Asm.js的简单介绍
  • flask接收请求并推入栈
  • Git学习与使用心得(1)—— 初始化
  • iOS | NSProxy
  • iOS 颜色设置看我就够了
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • unity如何实现一个固定宽度的orthagraphic相机
  • 对JS继承的一点思考
  • 基于Android乐音识别(2)
  • 判断客户端类型,Android,iOS,PC
  • 前端相关框架总和
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • $.ajax()方法详解
  • (windows2012共享文件夹和防火墙设置
  • (八)Spring源码解析:Spring MVC
  • (多级缓存)缓存同步
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (分布式缓存)Redis持久化
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (一)基于IDEA的JAVA基础12
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)负载均衡,回话保持,cookie
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Framework .NET Core与 .NET 的区别
  • .net/c# memcached 获取所有缓存键(keys)
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Angular] 笔记 18:Angular Router
  • [C#]C#学习笔记-CIL和动态程序集
  • [C#]手把手教你打造Socket的TCP通讯连接(一)