Windows下的C++内存泄漏检测工具Visual Leak Detector (VLD)介绍及使用
在软件开发过程中,内存管理是一个至关重要的环节。内存泄漏不仅会导致程序占用越来越多的内存资源,还可能引发系统性能下降甚至程序崩溃。对于Linux平台来说,内存检测工具非常丰富,GCC自带的AddressSanitizer (asan) 就是一个功能强大的内存分析检测工具。然而,对于Windows平台,可选的内存检测工具相对较少。本文将详细介绍一款深受C++开发人员喜爱的内存泄漏检测工具——Visual Leak Detector (VLD)。
仓库地址:https://github.com/KindDragon/vld.git
VLD开源项目介绍
Visual C++ 提供了内置的内存泄漏检测,但其功能相当有限。这个内存泄漏检测器是作为Visual C++ 内置内存泄漏检测器的一个免费替代品而创建的。以下是Visual Leak Detector的一些特性,这些在内置检测器中均不存在:
-
为每个泄露块提供完整的堆栈跟踪,包括可用时的源文件和行号信息。
-
检测大多数,如果不是所有,类型的进程内内存泄漏,包括基于COM的泄漏和纯Win32堆泄漏。
-
可选择排除特定模块(如DLL甚至主EXE)免于泄漏检测。
-
提供泄露块的完整数据转储(以十六进制和ASCII格式)。
-
自定义内存泄漏报告:可保存到文件或发送给调试器,可包含不同级别的详细信息。
市场中已有其他针对Visual C++ 的泄漏检测器。但许多流行的选择,如Purify和BoundsChecker,价格高昂。一些免费替代品虽存在,但往往过于侵入性、限制性强或不可靠。目前,Visual Leak Detector 是唯一一款免费提供的内存泄漏检测器,它以专业级功能和易于使用的库形式,为Visual C++ 提供全部上述特性。
文档
请阅读文档:https://github.com/KindDragon/vld/wiki
VLD的工作原理
Visual Leak Detector 是一款专门针对Windows平台的内存泄漏检测工具,它通过DLL Hook技术,直接注入到Win32的DLL中,从而监控和拦截系统的内存分配和释放函数,如malloc、free、new、delete等。这种方法使得VLD能够准确地追踪和记录内存分配和释放的过程,从而检测出内存泄漏。
需要注意的是,VLD主要用于编译器的Debug模式下进行内存泄漏检测。由于在Release模式下,编译器可能会进行一系列优化,这可能会导致函数调用的堆栈信息丢失,从而影响VLD的检测效果。
另外,在程序运行过程中,由于堆内存的动态分配和释放,可能会出现误判的情况。因此,VLD会在应用程序退出时,输出详细的内存检测报告。这份报告不仅会显示内存泄漏的具体位置,还会提供调用堆栈信息和泄漏内存的数据,帮助开发者快速定位和解决问题。
VLD的安装与配置
Visual Leak Detector 是一个免费开源的C/C++内存泄漏检测工具。在安装和使用之前,我们需要先下载并安装VLD。VLD的官方网站提供了详细的安装说明,以下是安装步骤:
- 访问VLD的官方网站进行下载:https://kinddragon.github.io/vld/。
- 安装完成后,VLD会自动将其包含文件(include目录)添加到Visual Studio的附加包含目录,同时将静态库文件(lib目录)添加到附加库目录。无需手动添加这些目录,这使得VLD的安装过程非常简便。
VLD的使用
在工程中使用VLD非常简单,只需在main函数所在的CPP文件中包含<vld.h>即可。这样,当程序在Debug模式下运行并退出时,VLD会自动生成内存泄漏检测报告。
如果想将VLD的检测报告保存到文件中,可以将VLD安装目录下的vld.ini文件复制到可执行文件所在的目录中,然后根据需要修改配置文件选项。例如,可以将以下两行配置信息添加到vld.ini文件中:
ReportFile =.\memory_leak_report.txt
ReportTo = both
上述配置表示将内存泄漏检测报告同时输出到控制台和文件中,文件名为memory_leak_report.txt。
常见误区
有些人可能会认为VLD只能用于Visual Studio 2008到Visual Studio 2015之间的版本。这种说法是不准确的。实际上,VLD的原代码是开源的,完全支持自行编译。因此,无论使用的是哪个版本的Visual Studio,都可以通过编译源代码来使用VLD进行内存泄漏检测,只是目前该项目作者转向linux了,目前上面的日期停留在了2017。
检测内存泄漏
集成VLD后,只要你的程序存在内存泄漏,程序退出时VLD将在调试输出中详细显示泄漏的位置,包括文件名、行号和泄漏大小。
示例代码段
假设一个简单的内存分配未被释放的情况:
#include <iostream>
#include <vld.h>int main()
{int* ptr = new int[10]; // 分配内存// 注意:这里没有调用delete[] ptr释放内存return 0; // VLD将会在此处报告内存泄漏
}
运行此程序,在Visual Studio的输出窗口或命令行调试输出中,你会看到关于未释放内存的报告。
总结
Visual Leak Detector 是一款功能强大且易于使用的内存泄漏检测工具,特别适用于Windows平台上的C++项目开发。通过利用Hook技术来监控内存分配和释放过程,VLD能够提供非常详尽的内存泄漏检测报告。在实际使用过程中,只需简单配置即可实现对项目内存泄漏的全面检测,从而有效提升代码质量和程序稳定性。
希望本文能帮助你在Windows平台上更有效地进行C++内存泄漏检测。如果有任何问题或建议,欢迎在评论区留言交流。
其他资源
https://blog.csdn.net/huxyc/article/details/107239486
https://blog.csdn.net/gitblog_00058/article/details/137450465
https://github.com/KindDragon/vld.git
https://gitcode.com/gh_mirrors/vl/vld
相关文章:
Windows下的C++内存泄漏检测工具Visual Leak Detector (VLD)介绍及使用
在软件开发过程中,内存管理是一个至关重要的环节。内存泄漏不仅会导致程序占用越来越多的内存资源,还可能引发系统性能下降甚至程序崩溃。对于Linux平台来说,内存检测工具非常丰富,GCC自带的AddressSanitizer (asan) 就是一个功能…...

[苍穹外卖] 1-项目介绍及环境搭建
项目介绍 定位:专门为餐饮企业(餐厅、饭店)定制的一款软件产品 功能架构: 管理端 - 外卖商家使用 用户端 - 点餐用户使用 技术栈: 开发环境的搭建 整体结构: 前端环境 前端工程基于 nginx 运行 - Ngi…...

人物一致性训练测评数据集
1.Pulid 训练:由1.5M张从互联网收集的高质量人类图像组成,图像标题由blip2自动生成。 测试:从互联网上收集了一个多样化的肖像测试集,该数据集涵盖了多种肤色、年龄和性别,共计120张图像,我们称之为DivID-120,作为补充资源,还使用了最近开源的测试集Unsplash-50,包含…...
AI的出现,是否能替代IT从业者?
AI的出现,是否能替代IT从业者? AI在IT领域中的应用已成趋势,IT 从业者们站在这风暴之眼,面临着一个尖锐问题:AI 是否会成为 “职业终结者”?有人担忧 AI 将取代 IT 行业的大部分工作,也有人坚信…...

乘联会:1月汽车零售预计175万辆 环比暴跌33.6%
快科技1月18日消息,据乘联会的初步推算,2025年1月狭义乘用车零售总市场规模预计将达到约175万辆左右。与去年同期相比,这一数据呈现了-14.6%的同比下降态势;而相较于上个月,则出现了-33.6%的环比暴跌情况。 为了更清晰…...

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145188660 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…...

开发神器之cursor
文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器,集成了先进的 AI 技术,旨在提升编程效率。以下是其主要特点和功能&a…...

使用 Ansys Motor-CAD 的自适应模板加速创新
应对现代电机设计挑战 电机设计不断发展,Ansys 正在通过创新解决方案引领潮流,不断突破可能的界限。随着电动汽车、工业自动化和可再生能源系统的快速增长,对优化电机的需求从未如此之高。工程师面临着越来越大的压力,他们需要开发…...

RabbitMQ前置概念
文章目录 1.AMQP协议是什么?2.rabbitmq端口介绍3.消息队列的作用和使用场景4.rabbitmq工作原理5.整体架构核心概念6.使用7.消费者消息推送限制(work模型)8.fanout交换机9.Direct交换机10.Topic交换机(推荐)11.声明队列…...

http转化为https生成自签名证书
背景 项目开发阶段前后交互采用http协议,演示环境采用htttps协议 ,此处为个人demo案例 组件 后端:springBoot 前端:vue web 服务:tomcat 部署环境:linux 生成自签名证书 创建目录 存储证书位置 # mkdir -p…...

《贪心算法:原理剖析与典型例题精解》
必刷的贪心算法典型例题! 算法竞赛(蓝桥杯)贪心算法1——数塔问题-CSDN博客 算法竞赛(蓝桥杯)贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法(蓝桥杯)贪心算法3——二维数组排序与贪心算…...

【网络协议】【http】【https】RSA+AES-TLS1.2
【网络协议】【http】【https】RSAAES-TLS1.2 https并不是一个协议 而是在传输层之间添加了SSL/TLS协议 TLS 协议用于应用层协议(如 HTTP)和传输层(如 TCP)之间,增加了一层安全性来解决 HTTP 存在的问题,H…...

【数据库】MySQL数据库之约束与多表查询
约束 1.概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据目的:保证数据库中数据的正确性、有效性,完整性和一致性分类: 注意:约束是作用于表中字段上的,可以在创建表/修改表…...
【Pandas】pandas Series dot
Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...

02UML图(D2_行为图)
目录 学习前言 ---------------------------------- 讲解一:活动图 ---------------------------------- 讲解二:用例图 ---------------------------------- 讲解三:状态机图 ---------------------------------- 讲解四:…...

Kali环境变量技巧(The Environment Variable Technique Used by Kali
Kali环境变量技巧 朋友们好,我们今天继续更新《黑客视角下的Kali Linux的基础与网络管理》中的管理用户环境变量。为了充分利用我们的黑客操作系统Kali Linux,我们需要理解和善于使用环境变量,这样会使我们的工具更具便利,甚至具…...

【C++】如何从源代码编译红色警戒2地图编辑器
【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库,已经包含三方库。 一、运行效果:二、源代码来源及编程语言:三、环境搭建:安装红警2安装VS2022下载代码,源代码其实不太多,…...

安路FPGA开发工具TD:问题解决办法 及 Tips 总结
安路科技(Anlogic)是一家专注于高性能、低功耗可编程逻辑器件(FPGA)设计和生产的公司。其提供的开发工具TD(TangDynasty)是专门为安路FPGA系列产品设计的集成开发环境(IDE)。以下是对…...

【Django开发】django美多商城项目完整开发4.0第12篇:商品部分,表结构【附代码文档】
本教程的知识点为: 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计: 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…...

IDEA2023版中TODO的使用
介绍:TODO其实本质上还是注释,只不过加上了TODO这几个字符,可以让使用者快速找到。 注意:在类、接口等文件中,注释是使用// 即:// TODO 注释内容 在配置文件中,注释是使用# 即:# TO…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...