当前位置:首页 > 单片机 > CPP开发者
[导读]C/C程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的-从性能下降到内存耗尽,甚至会影响其他程序的正常运行...


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


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



1

VLD 简介


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


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

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

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

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

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


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



2

下载安装

  • 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.dll、vld_x64.dll

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

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



3

使用方法


新建一个 C 控制台程序:


#include 

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 

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

    delete[]a;

    return 0;
}

再次运行程序,内存泄漏已经不见了:




4

工作原理


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


  1. 在初始化时注册一个钩子函数;

  2. 在内存分配时,该钩子函数会被调用,以记录当时的现场;

  3. 检查堆内存分配链表,以确定是否存在内存泄漏,并将泄漏内存的现场转换成可读的形式输出。


如果对细节实现感兴趣,建议研究一下 VLD 的源码。


- EOF -

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭