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…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
