【C++】【VLD】VLD检测内存泄漏

news2024/11/24 3:16:22

【C++】【VLD】VLD检测内存泄漏

C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。

然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的 - 从性能下降到内存耗尽,甚至会影响其他程序的正常运行。


一、VLD 简介

VLD(全称:Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。与其它内存检测工具相比,它在检测到内存泄漏的同时,还具有如下特点:

  • 可得到内存泄漏点的调用堆栈,以及其所在文件及行号

  • 可得到泄露内存的完整数据;

  • 可设置内存泄露报告的级别

  • 提供了打包好的 lib 库,使用时无须编译源码,直接使用即可;

  • 源码使用 GNU 许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。

VLD 简单易用,只需要添加库并包含头文件,然后正常运行自己的程序,就可以发现内存问题了;如果深入源码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理、以及内存操作的常用技巧等。

二、下载安装

VLD 主页:https://kinddragon.github.io/vld/

文档地址:https://github.com/KindDragon/vld/wiki

GitHub 地址:https://github.com/KindDragon/vld

进入主页后,点击右上角的“Download Installer”按钮,下载 VLD 安装程序(目前版本:vld-xxx-setup.exe):
在这里插入图片描述
下载完成之后,进行傻瓜式安装(下一步 …下一步),安装后的目录如下所示:
在这里插入图片描述

其中,各目录及其内容为:

bin:包含了运行时的库文件 - dbghelp.dllvld_x64.dll

include:包含了编译时要用到的头文件 - vld.hvld_def.h

lib:包含了编译时要用到的库文件 - vld.lib


三、使用方法

新建一个 C++ 控制台程序:

#include <vld.h>

int main()
{
    int *a = new int[10];

    return 0;
}

然后,配置项目:

  • 附加包含目录:D:\Program Files\Visual Leak Detector\include

  • 附加库目录:D:\Program Files\Visual Leak Detector\lib\Win64

  • 附加依赖项:vld.lib

截止目前,VLD 最高支持到 VS 2015,在 VS 2019 中没有太多有关内存泄漏的信息,可以在属性设置中做相关配置:
在这里插入图片描述
在 Debug 模式下运行程序,VLD 会输出内存泄漏报告,其中包含了完整的调用堆栈:
在这里插入图片描述看到了吧,提示第 5 行出现了内存泄漏。
还等什么,抓紧时间解决啦:

#include <vld.h>

int main()
{
    int *a = new int[10];

    delete[]a;

    return 0;
}

再次运行程序,内存泄漏已经不见了:
在这里插入图片描述

四、工作原理

想必到这里,很多小伙伴都对 VLD 的工作原理感兴趣,其实它的主要工作分了三步:

  1. 在初始化时注册一个钩子函数;
  2. 在内存分配时,该钩子函数会被调用,以记录当时的现场;
  3. 检查堆内存分配链表,以确定是否存在内存泄漏,并将泄漏内存的现场转换成可读的形式输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络——传输层

序言 计算机网络中的传输层在当今的社会起到了什么作用&#xff1f; 计算机网络中的传输层在通信和数据传输方面起着至关重要的作用。传输层是计算机网络体系结构中的一层&#xff0c;它负责提供端到端的可靠数据传输和通信服务&#xff1b;有着以下几个方面作用&#xff1a;可…

3-css高级特效-2

01-空间转换 空间转换简介 空间&#xff1a;是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间&#xff0c;Z 轴位置与视线方向相同。空间转换也叫 3D转换属性&#xff1a;transform 平移 transform: translate3d(x, y, z); transform: translateX(); transfor…

chatgpt赋能python:Python聊天机器人程序:把智能带入聊天

Python聊天机器人程序&#xff1a;把智能带入聊天 在数字化时代&#xff0c;机器人指引和客户服务变得越来越流行。为了快速而有效地满足这种需求&#xff0c;聊天机器人被广泛研究与开发。Python是在这方面一个非常受欢迎的编程语言&#xff0c;能够快速地构建聊天机器人。在…

【C++】win 10 / win 11:Visual Studio 2022 社区版免费下载与安装

目录 一、Visual Studio 2022 下载 二、Visual Studio 2022 安装 三、Visual Studio 2022 快捷方式创建 四、Visual Studio 2022 使用 一、Visual Studio 2022 下载 Visual Studio 2022 官方下载https://visualstudio.microsoft.com/zh-hans/downloads/首先登陆 Visual Stu…

基于Java医院在线挂号预约系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Jmeter简单实现登录测试

目录 前言&#xff1a; 1、添加线程组--在测试计划上右击-添加-Threads-线程组 2、添加http请求默认值--在线程组上右击-添加-配置元器件-http请求默认值 3、添加sampler-http请求-登录界面 4、添加sampler-http请求-登录-携带用户名和密码 5、创建存放用户名和密码的文件…

数通王国历险记之TCP协议下的三大协议的验证实验

系列文章目录 数通王国历险记&#xff08;1&#xff09; 前言 一&#xff0c;我们要先知道PDU是什么&#xff1f; 二、TCP协议下的三大协议的验证实验 1.FTP的验证实验 1&#xff0c;拓扑图 2.将lsw4配置一下 3&#xff0c;FTP服务器端开启FTP服务&#xff1a; 4&#x…

SpringBoot 如何使用 TestEntityManager 进行 JPA 集成测试

SpringBoot 如何使用 TestEntityManager 进行 JPA 集成测试 简介 在开发过程中&#xff0c;JPA 是常用的持久化框架之一&#xff0c;它可以帮助我们将对象映射到数据库中&#xff0c;并提供了一系列操作数据库的 API。在进行 JPA 的开发和测试时&#xff0c;我们通常会使用一…

Mybatis实现分页功能

1、关于逻辑分类和物理分页 分页可分为逻辑分页和物理分页 逻辑分页是一次性把全部数据查询加载进内存 &#xff0c;然后再进行分页。这样优点是减少IO次数&#xff0c;适合频繁访问、数据量少的情况。缺点是不适合大数据量&#xff0c;容易造成内存溢出。物理分页是利用limi…

Android JVM 原理简析

当我们在开发 Android 应用程序时&#xff0c;我们实际上是在使用 Java 编程语言编写代码&#xff0c;并将其编译为在 Android 上运行的字节码。这些字节码最终在 Android 设备上的 Java 虚拟机&#xff08;JVM&#xff09;中执行。 Android JVM的意义 学习 Android JVM&#…

Java基础知识面试题

Java概述 何为编程 编程就是使用某种程序设计语言编写程序代码让计算机解决某个问题 为了使计算机能够理解人的意图&#xff0c;人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机&#xff0c;使得计算机能够根据人的指令一步一步去工作&a…

Spring相关API

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;JavaEE、Spring SpringAPI 1、继承体系2、 getBean() 1、继承体系 上述继承体系中的主要类和接口包括&#xff1…

WebRTC-STUN协议详解

1、STUN协议概述 STUN&#xff08;Session Traversal Utilities for NAT&#xff09;NAT会话穿透工具&#xff0c;STUN是一个Client/Server协议&#xff0c;支持请求/响应类型、指示类型两种类型。STUN作为ICE&#xff08;Interactive Connectivity Establishment&#xff0c;…

【需求实现】输入多少就输出多少的拟合任务如何实现(一):数据集分割

神经网络中输入多少数据就输出多少数据的情况如何实现 导读数据集长什么样&#xff1f;怎么分割数据集&#xff1f;时间窗口分析模板我知道你很急&#xff0c;但你先别急 换个思路 导读 在实习的过程中遇到了这样一种需求&#xff1a;给定一条序列&#xff0c;并另外给定一条期…

使用ffmpeg将rtsp流转流实现h5端播放

主要实现rtsp转tcp协议视频流播放 ffmpeg下载安装&#xff08;公认业界视频处理大佬&#xff09; a、官网地址&#xff1a;www.ffmpeg.org/ b、gitHub&#xff1a;github.com/FFmpeg/FFmp… c、推荐下载地址&#xff1a;ffmpeg.zeranoe.com/builds/ (选择如下图) 2.配置ffmpeg…

期末复习【计算机系统结构】

期末复习【计算机系统结构】 前言推荐押题公式 期末复习重点第1章 计算机体系结构的基本概念1.3 定量分析技术1.3.1计算机系统设计的定量原理 第2章 计算机指令集结构第3章 流水线技术3.2 流水线的性能指标3.2.1 吞吐率3.2.2 加速比3.2.3 效率3.2.4 流水线性能分析举例 3.3 流水…

miniconda的安装

1. conda 是一个开源的包、环境管理器&#xff0c;可以用于在同一个机器上安装不同版本的软件包及其依赖&#xff0c;并能够在不同的环境之间切换。 miniconda官网下载 miniconda清华镜像下载 找到自己想要安装的版本&#xff0c;我这里选择的是Miniconda3-4.7.12.1-Linux-x…

OUC编译原理实验报告 实验4:验证Yacc的使用/实验e4:从语言SUM到栈式计算机STACK的机器语言的翻译

编译原理实验报告 实验4&#xff1a;验证Yacc的使用 实验e4&#xff1a;从语言SUM到栈式计算机STACK的机器语言的翻译 中国海洋大学编译原理实验2023春 仅供同学参考思路 请勿直接抄袭 否则可能喜提0分 目录 文章目录 编译原理实验报告目录一.实验目的二.实验内容实验4实验…

多进程爬虫实战-摩托车网

前言 最近有遇到很多私信让我讲一讲多进程的爬虫&#xff0c;我发现大家对爬虫的框架写法和进程的理解有很多的问题和疑问&#xff0c;这次就带来一个小实战让大家理解多进程爬虫以及框架的写法 由于进程爬虫会对任何服务器都有一定的影响&#xff0c;本文仅供学习交流使用&…

【Linux后端服务器开发】C程序预处理

目录 一、源文件到可执行程序的过程 二、预定义符号 三、#define宏定义 四、条件编译 一、源文件到可执行程序的过程 预处理&#xff1a;去注释&#xff0c;宏替换&#xff0c;头文件展开&#xff0c;条件编译编译&#xff1a;c语言 ---> 汇编语言&#xff08;语法分析…