用VLD调查VC内存泄漏
一、发现内存泄漏
使用VS2022,发现提示有内存泄漏,检查了所有的new,确认都有相应的delete释放。
Detected memory leaks!
Dumping objects ->
{1914} normal block at 0x0000021FDFFBD2E0, 48 bytes long.Data: <` > 60 E2 FB DF 1F 02 00 00 CD CD CD CD CD CD CD CD
{1907} normal block at 0x0000021FDFFC22C0, 16 bytes long.Data: <8 > 38 F5 FA DF 1F 02 00 00 00 00 00 00 00 00 00 00
{1838} normal block at 0x0000021FDFFBCE10, 48 bytes long.Data: < > 90 DF FB DF 1F 02 00 00 CD CD CD CD CD CD CD CD
{1831} normal block at 0x0000021FDFFCCE10, 16 bytes long.Data: <8 > 38 FB FA DF 1F 02 00 00 00 00 00 00 00 00 00 00
{1699} normal block at 0x0000021FDFFBCB00, 48 bytes long.Data: <@ > 40 BB F8 DF 1F 02 00 00 88 BB F8 DF 1F 02 00 00
{1692} normal block at 0x0000021FDFFCD450, 16 bytes long.Data: <8 > 38 F9 FA DF 1F 02 00 00 00 00 00 00 00 00 00 00
{1683} normal block at 0x0000021FDFFBD0B0, 48 bytes long.Data: < X > 10 AF F8 DF 1F 02 00 00 58 AF F8 DF 1F 02 00 00
{1676} normal block at 0x0000021FDFFCCDC0, 16 bytes long.Data: < > B8 F4 FA DF 1F 02 00 00 00 00 00 00 00 00 00 00
Object dump complete.
手工很难排查,需要使用工具了。
二、安装VLD
从往上搜索下载VLD,Visual Leak Detector | Enhanced Memory Leak Detection for Visual C++
下载最新版,双击安装,默认路径在C:\Program Files (x86)\Visual Leak Detector\下。
三、设置编译环境
在主程序的stdafx.h文件中,afxwin.h头文件之前,加入vld.h头文件。
// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS#include "vld.h"#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展#include <afxdisp.h> // MFC 自动化类
添加头文件路径:C:\Program Files (x86)\Visual Leak Detector\include;

添加vld.lib类库应用

把C:\Program Files (x86)\Visual Leak Detector\bin\Win64和C:\Program Files (x86)\Visual Leak Detector\lib\Win64目录下的所有文件都复制到当前工程的.\x64\Debug路径下。添加类库的路径:

然后编译即可。
四、检测内存泄漏
运行之后,查看程序加载的模块,确认vld类库加载成功

退出程序,显示VLD已经检测出内存泄漏,单给出的信息不明所以。。
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 22 at 0x00000000962B2B80: 248 bytes ----------Leak Hash: 0x656456F1, Count: 1, Total 248 bytesCall Stack (TID 19720):ucrtbased.dll!malloc_dbg()mfc140d.dll!0x00007FFFC44332DA()mfc140d.dll!0x00007FFFC4579350()mfc140d.dll!0x00007FFFC457938D()mfc140d.dll!0x00007FFFC49A8C95()mfc140d.dll!0x00007FFFC4908D3A()mfc140d.dll!0x00007FFFC4908430()mfc140d.dll!0x00007FFFC4A2C92C()mfc140d.dll!0x00007FFFC4A26474()mfc140d.dll!0x00007FFFC4531F05()mfc140d.dll!0x00007FFFC451D9E0()mfc140d.dll!0x00007FFFC451C1B8()mfc140d.dll!0x00007FFFC444839B()mfc140d.dll!0x00007FFFC47A163E()E:\Work\09.SourceCode\ArtecRoth.cpp (71): ArtecRoth.exe!CArtecRothApp::InitInstance()mfc140d.dll!0x00007FFFC4A2CA3C()D:\a\_work\1\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\appmodul.cpp (26): ArtecRoth.exe!WinMain()D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl (107): ArtecRoth.exe!invoke_main()D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl (288): ArtecRoth.exe!__scrt_common_main_seh() + 0x5 bytesD:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl (331): ArtecRoth.exe!__scrt_common_main()D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_winmain.cpp (17): ArtecRoth.exe!WinMainCRTStartup()KERNEL32.DLL!BaseThreadInitThunk() + 0x14 bytesntdll.dll!RtlUserThreadStart() + 0x21 bytesData:00 00 00 00 00 00 00 00 08 80 30 96 28 01 00 00 ........ ..0.(...28 1A 10 6F 00 00 00 00 58 75 D0 C4 FF 7F 00 00 (..o.... Xu......28 0A 2E 96 28 01 00 00 FD 19 10 11 00 00 00 00 (...(... ........C8 75 D0 C4 FF 7F 00 00 88 2B 2B 96 28 01 00 00 .u...... .++.(...B3 14 10 C4 FF FF FF FF 98 75 D0 C4 FF 7F 00 00 ........ .u......10 0A 2E 96 28 01 00 00 20 1A 10 3E 00 00 00 00 ....(... ...>....A8 75 D0 C4 FF 7F 00 00 00 00 00 00 00 00 00 00 .u...... ........91 18 10 01 00 00 00 00 68 75 D0 C4 FF 7F 00 00 ........ hu......40 0A 2E 96 28 01 00 00 4B 1A 10 65 00 00 00 00 @...(... K..e....88 75 D0 C4 FF 7F 00 00 E8 2B 2B 96 28 01 00 00 .u...... .++.(...22 1A 10 3C 00 00 00 00 B8 75 D0 C4 FF 7F 00 00 "..<.... .u......E0 09 2E 96 28 01 00 00 50 1A 30 1B 00 00 00 00 ....(... P.0.....D8 75 D0 C4 FF 7F 00 00 70 0A 2E 96 28 01 00 00 .u...... p...(...12 17 30 FD FF FF FF FF E8 75 D0 C4 FF 7F 00 00 ..0..... .u......48 2C 2B 96 28 01 00 00 47 1A 30 53 00 00 00 00 H,+.(... G.0S....F8 75 D0 C4 FF 7F 00 00 .u...... ........
说明内存泄露没有发生在主程序中,把上面的编译设置从主程序中去除,在下面调用的dll工程中按同样的方法设置,多个dll工程的话,需要挨个试。
在dll工程中设置,重新编译后,运行结果果然找到了具体位置。
---------- Block 3747 at 0x00000000C2B10AD0: 48 bytes ----------Leak Hash: 0x60ABD716, Count: 1, Total 48 bytesCall Stack (TID 20788):mfc140d.dll!0x00007FFFC4093200()C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\include\xmemory (78): AtcTransRoth.dll!std::_Default_allocate_traits::_Allocate()C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\include\xmemory (235): AtcTransRoth.dll!std::_Allocate<16,std::_Default_allocate_traits,0>() + 0xC bytesC:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\include\xmemory (836): AtcTransRoth.dll!std::allocator<TransCoil *>::allocate()C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\include\vector (1673): AtcTransRoth.dll!std::vector<TransCoil *,std::allocator<TransCoil *> >::_Reallocate_exactly() + 0x10 bytesC:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\include\vector (1750): AtcTransRoth.dll!std::vector<TransCoil *,std::allocator<TransCoil *> >::reserve()E:\Work\AtcArray.h (114): AtcTransRoth.dll!vector<TransCoil *>::Reserve() + 0x13 bytesE:\Work\AtcRothData.cpp (182): AtcTransRoth.dll!CAtcRothData::GetCoils()E:\Work\AtcRothData.cpp (831): AtcTransRoth.dll!CAtcRothData::CreateElement() + 0x1B bytesE:\Work\AtcRothData.cpp (616): AtcTransRoth.dll!CAtcRothData::LoadSchemaFromXml() + 0x13 bytesE:\Work\AtcRothData.cpp (34): AtcTransRoth.dll!CAtcRothData::LoadData() + 0x21 bytesE:\Work\ArtecRothDlg.cpp (207): ArtecRoth.exe!CArtecRothDlg::OnEnChangeMfceditbrowse1() + 0x41 bytesmfc140d.dll!0x00007FFFC44A21CC()mfc140d.dll!0x00007FFFC44A1A06()mfc140d.dll!0x00007FFFC4508F2C()
从提示的信息上看是vector申请的内存没有释放。通过仔细查看, 确认是TransWindingElementCoil 结构体中出现了内存泄漏,问题出在了结构体的继承上。
struct TransWindingElement
{CString chName;CString chLabel;AemTransElement emType;AemTransJoint emJoint;
};struct TransWindingElementCoil : TransWindingElement
{vector<TransCoil*> arCoil;
};
在delete释放TransWindingElementCoil 对象是,由于保存的是父结构体的指针,只调用了TransWindingElement的析构函数,而没有调用TransWindingElementCoil 对象的析构函数,造成了vector对象所在内存空间的泄漏。
五、处理方法
给父结构体加虚析构函数
struct TransWindingElement
{virtual ~TransWindingElement() {}CString chName;CString chLabel;AemTransElement emType;AemTransJoint emJoint;
};struct TransWindingElementCoil : TransWindingElement
{vector<TransCoil*> arCoil;
};
运行再无内存泄漏。
六、结束
在编程是需要时刻观察内存泄漏信息,出现内存泄漏要及时处理。堆积时间越长,则越难处理,尤其在运行计算的大循环中,调式内存泄漏极其麻烦。
相关文章:
用VLD调查VC内存泄漏
一、发现内存泄漏 使用VS2022,发现提示有内存泄漏,检查了所有的new,确认都有相应的delete释放。 Detected memory leaks! Dumping objects -> {1914} normal block at 0x0000021FDFFBD2E0, 48 bytes long.Data: < >…...
【Java 进阶篇】使用 JDBCTemplate 执行 DQL 语句详解
在前面的文章中,我们已经学习了如何使用 Spring 的 JDBCTemplate 执行 DML(Data Manipulation Language)操作,包括插入、更新和删除操作。现在,让我们来深入了解如何使用 JDBCTemplate 执行 DQL(Data Query…...
了解了spring mvc web容器中一个http请求的全过程,能给我们提升多少武力值
继上一篇文章什么,这年头还有人不知道404_cow__sky的博客-CSDN博客后,有些同学发现,学了之后有啥用,有什么实际场景可以用到吗?程序员就是这样,不习惯于纸上谈兵,给一个场景show me code才是最实…...
【BBC新闻文章分类】使用 TF 2.0和 LSTM 的文本分类
一、说明 NLP上的许多创新是如何将上下文添加到词向量中。常见的方法之一是使用递归神经网络...
set和map的封装
目录 介绍 红黑树代码 set insert的迭代器转换问题 为什么会有这样的问题? 如何解决 代码 map 注意点 代码 介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <…...
java基础练习--基础语法
预备知识:Java基本语法、分支、循环、数组和字符串 7-1 累加器 请你实现一个累加器。输入n个非负整数,输出他们的和。 1<n<1000,而每个数则<10000。 输入格式: 输入包括两行。 第一行:包括一个整数n,表示总共有n个数。 第二行:包…...
Android12 OTA编译差分包报错问题
前言 在Ubuntu 20.04.4 LTS系统中编译Android12 OTA差分包的时候提示如下报错log: Warning: releasetools script should be invoked as hermetic Python executable -- build and run ota_from_target_files directly. Traceback (most recent call last):File "./bu…...
现代c++手撸2309神经网络最简化版230901
用c++输入数据:vector<vector<float>> inputs = { {1, 1}, {1, 0} };数据targets={0,1}; 测试:vector<vector<float>> inputs22 = { {1, 0}, {1,1} }; 构建神经网络,例如:NeuralNetwork nn({ 2, 4, 1 }); 则网络有四层、输入层2个节点、输出层1个节…...
Qt之显示PDF文件
之前使用过mupdf库,能够成功显示pdf,但是我用着有BUG,不太理解它的代码,搞了好久都不行。后面又试了其他库,如pdfium、popler、下载了很多例程,都跑不起来!后面偶然得知xpdf库,看起来…...
[极客大挑战 2019]FinalSQL - 异或盲注
1、这题的关键是找注入点,如果选择用户名、密码作为输入点就麻烦了 2、注入点:按钮,点击就传id;当id1时,提示Click others 可以利用id的特性,构造异或匹配 payload: f"1^(ord(substr((select…...
【Go语言实战】(25) 分布式算法 MapReduce
MapReduce 写在前面 身为大数据专业的学生,其实大学我也多多少少接触过mapreduce,但是当时觉得这玩意太老了,觉得这和php一样会被时代淘汰。只能说当时确实太年轻了,没有好好珍惜那时候的学习资源… 现在回过头来看mapreduce&a…...
【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解(提供工具)
工具下载百度网盘链接(包含所有用到的工具): 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.…...
战火使命ssr排名,战火使命角色强度排行
在战火使命中,很多玩家都在关注SSR角色的强度排行,那么,下面就为大家分享一下小编整理的最新战火使命ssr排名,一起来看看吧。 关注【娱乐天梯】,获取内部福利号 一、SSR角色排名榜: 1. 克拉拉、艾蕾娜、杰西…...
CSS之linear-gradient( ) 函数—背景颜色渐变设计
目录 linear-gradient( ) 函数 简介: 语法: 详解: 例如: linear-gradient( ) 函数 简介: linear-gradient 函数是 CSS 中用于创建线性渐变的函数。它接受一个或多个参数,并使用这些参数创建一个渐变。…...
[Unity]未能加载一个或多个断点问题
【背景】 大家2023国庆快乐,虽然是假期,我还是继续码些文章。 今天写项目时遇到个环境问题,新建脚本时双击调起VS编辑器,忽然提示无法加载一个或多个断点(当时忘记截图了,现在已解决,就不上图了…...
Qt中的基础数据类型
1.基础类型 因为Qt是一个C++ 框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型 QT基本数据类型定义在#include <QtGlobal> 中,QT基本数据类型有: 类型名称注释备注qint8signed ch…...
2023阿里云域名优惠口令大全
2023年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续…...
湖南软件测评公司简析:软件功能测试和非功能测试的联系和区别
一、软件功能测试 软件功能测试旨在验证软件是否按照需求规格说明书的要求正常工作。具体而言,功能测试会对软件的所有功能进行测试,以确保其满足用户的需求和预期。在进行功能测试时,根据需求规格说明书编写测试用例,并在测试…...
HuggingFace Transformers教程(1)--使用AutoClass加载预训练实例
知识的搬运工又来啦 ☆*: .。. o(≧▽≦)o .。.:*☆ 【传送门>原文链接:】https://huggingface.co/docs/transformers/autoclass_tutorial 🚗🚓🚕🛺🚙🛻🚌Ƕ…...
Qt获取当前所用的Qt版本、编译器、位数等信息
//详细的Qt版本编译器位数 QString compilerString "<unknown>"; { #if defined(Q_CC_CLANG)QString isAppleString; #if defined(__apple_build_version__)isAppleString QLatin1String(" (Apple)"); #endifcompilerString QLatin1String("…...
2026年HRSaaS系统Top10榜单:AI能力重构HR管理格局,谁真正站稳头部?
HRSaaS市场在2026年正式进入以AI能力为核心竞争力的新阶段。不同于此前以"功能完整性"为主要评判标准的选型逻辑,2026年的大型企业HR决策者,在系统选型时更关注一个本质问题:这套系统有多少HR日常工作是真正由AI完成的,…...
Phi-3-Mini-128K效果展示:处理带Markdown表格的API文档并生成测试用例
Phi-3-Mini-128K效果展示:处理带Markdown表格的API文档并生成测试用例 1. 工具核心能力概览 Phi-3-Mini-128K作为微软最新推出的轻量化对话模型,在处理结构化技术文档方面展现出惊人的能力。本次重点展示其两大核心能力: 复杂文档解析&…...
YOLOv11实战:手把手教你用DBB改进C3k2块(附完整代码)
YOLOv11实战:DBB模块深度改造C3k2块的完整指南 1. 理解DBB模块的核心价值 在计算机视觉领域,Diverse Branch Block(DBB)作为卷积结构的创新设计,正在重新定义特征提取的方式。这种多分支结构的核心思想源于对神经网络特…...
Ostrakon-VL-8B艺术鉴赏分析:解读画作风格、情感与历史背景
Ostrakon-VL-8B艺术鉴赏分析:解读画作风格、情感与历史背景 你有没有过这样的经历?站在一幅画前,感觉它很美,却说不出它到底好在哪里,属于什么风格,画家想表达什么。或者,面对一幅历史名画&…...
无刷电机霍尔线序快速诊断:六种组合的波形特征与实战排查指南
1. 无刷电机霍尔线序问题:为什么需要快速诊断? 第一次调试无刷电机时,最让人头疼的就是霍尔线序问题。我清楚地记得自己第一次面对一堆没有标记的线缆时的茫然——ABC、UVW这些字母排列组合起来有六种可能,但只有一种能让电机正常…...
API配置踩坑实录:OpenClaw与DeepSeek、百炼大模型对接的密钥验证与网络调试
一、开头:那个让我想砸键盘的下午 上周五下午,我盯着屏幕,手指在键盘上悬了好几分钟,最后还是狠狠按下了回车。 openclaw config set model.api_key sk-xxxxx然后,我点开日志文件:/var/log/openclaw/api.lo…...
高通410随身WiFi救砖实战手记 | QPST工具链与MSM8916日志解析
1. 高通410随身WiFi救砖前的准备工作 遇到一台变砖的高通410(MSM8916)随身WiFi设备时,先别急着动手。我经历过多次救砖失败后发现,准备工作不到位是导致后续操作翻车的主要原因。首先要确认设备确实进入了"砖机"状态——…...
FPGA通信接口选型避坑指南:从UART到PCIe的5个实战经验分享
FPGA通信接口选型避坑指南:从UART到PCIe的5个实战经验分享 当你在FPGA项目中选择通信接口时,是否曾遇到过这样的困境:明明选择了"看起来"合适的接口,却在项目后期遭遇信号干扰、带宽不足或兼容性问题?本文将…...
从实验室到生产线:Callendar-Van Dusen方程在工业温度控制中的5个关键应用场景
从实验室到生产线:Callendar-Van Dusen方程在工业温度控制中的5个关键应用场景 在精密制造与流程工业中,温度控制的精度往往直接决定产品质量与工艺稳定性。当工程师面对反应釜内0.5℃的波动要求,或是半导体晶圆加工中纳米级的热膨胀控制时&a…...
MSPM0L1306工程独立化移植指南:零SDK路径依赖
1. MSPM0L1306工程移植技术指南:构建可复用的独立开发环境 在嵌入式硬件产品开发周期中,工程文件的跨团队、跨环境交付是高频且关键的技术协作环节。当基于TI MSPM0L1306微控制器的原型系统完成初步验证后,往往需要将完整工程移交至其他工程师…...
