一、内存泄漏

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_MODULEVLD_PATH = "D:/Program Files/Visual Leak Detector"INCLUDEPATH += $${VLD_PATH}/includeLIBS += -L$${VLD_PATH}/lib/Win32 -lvld}
}

main.cpp 文件如下所示:

#include <QCoreApplication>// 添加 VLD 头文件
#ifdef VLD_MODULE
#include "vld.h"
#endifint 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

Visual C++ 内存泄露检测工具(VLD)相关推荐

  1. 内存泄露检测工具VLD相关配置

    参考链接: VLD(Visual LeakDetector)内存泄露库的使用 VS2019编译 内存泄漏检测工具VLD 一.源码下载 源码下载链接:https://github.com/KindDra ...

  2. Visual Studio内存泄露检测工具

    使用简介 在写程序的过程中,难免会遇到内存泄露的时候,这个时候如果手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是很耗时间和精力的.诚然,我们可以借助一些工具,而且我们还会惊奇地发现这 ...

  3. 内存泄漏检测工具VLD在VS2010中的使用举例

    Visual LeakDetector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.它的特点有:(1).它是免费开源的,采用LGPL协议:(2).它可以得到内存泄露点的调用堆栈,可 ...

  4. 几种内存泄露检测工具的比较

    概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...

  5. Ubuntu下内存泄露检测工具Valgrind的使用

    在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...

  6. 精准 iOS 内存泄露检测工具

    MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22   |   zepo   |   23 Comments 背景 平常我们都会用 Instrument 的 Lea ...

  7. 内存泄露检测工具比较

    From: http://blog.163.com/zhuang_qianxin/blog/static/29765138201051092529107/ 1.     ccmalloc-Linux和 ...

  8. memwatch内存泄露检测工具

    工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态 ...

  9. linux 内存泄露检测工具——valgrind

    valgrind是linux下一个可用调试.查看内存泄露的工具,其官方网站:http://www.valgrind.org/ 使用时可用命令: valgrind -v  --leak-check=fu ...

  10. kmemleak的使用---内存泄露检测工具【转】

    转自:http://blog.csdn.net/lishenglong666/article/details/8287783 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 内 ...

最新文章

  1. 线性代数 第四章 向量组的线性相关性
  2. linux剧集nfo生成器,精彩LINUX软件推荐
  3. sublime 消除锯齿_如何在Sublime中消除麻烦
  4. 前端学习(2520):环境搭建
  5. C++ std:: 的坑
  6. 实现一次加载多级所有的菜单
  7. 如何反馈问题issue?
  8. Flink-sql之当前日期
  9. dos格式化linux,linux mformat命令对MS-DOS文件系统的磁盘进行格式化
  10. Jenkins教程(Linux版)
  11. 基于Java的杨辉三角
  12. VMware安装windows server 2008 R2
  13. matlab中怎么使用数组,matlab中数组的基本使用
  14. JN5169 ZigBee 3.0 协议栈之 ZigBee 网络参数
  15. C语言初学者必学必会的C语言必背100代码
  16. VisualStudio 如何使用UML呢?(转自简书雨落随风)
  17. Pair Project: 电梯调度问题API设计(by 谢俊源 陆元伟)
  18. 我的理想高中作文理想是计算机,我的理想 高中作文
  19. 【Git从青铜到王者】第四篇:Git的分支与合并
  20. Spherical Harmonics Lighting in DirectX

热门文章

  1. 计算机英语词汇输入,常用计算机英语词汇:BIOS
  2. 笔记本测试屏幕的型号的软件,哪个软件可以检测到笔记本的型号
  3. 电力拖动PLC可编程控制器技能实训QY-DL865
  4. excel表格分割线一分为二_高效秘技!用EXCEL制作导航页和日志表管理日常工作...
  5. CH340串口驱动(包含各系统平台)
  6. matlab 离散数据 拐点,MATLAB 寻找离散点拐点
  7. 如何下载四川省卫星地图高清版大图
  8. Eclipse, Lomboz and Tomcat 的配置和调试
  9. Linux系统运维-Telnet命令
  10. 泛微协同办公e-cology9.0的Ecode二次开发实例说明