用VLD调查VC内存泄漏

news2024/11/20 10:35:36

一、发现内存泄漏

使用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 bytes
  Call 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 bytes
    D:\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 bytes
    ntdll.dll!RtlUserThreadStart() + 0x21 bytes
  Data:
    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 bytes
  Call 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 bytes
    C:\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 bytes
    C:\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 bytes
    E:\Work\AtcRothData.cpp (182): AtcTransRoth.dll!CAtcRothData::GetCoils()
    E:\Work\AtcRothData.cpp (831): AtcTransRoth.dll!CAtcRothData::CreateElement() + 0x1B bytes
    E:\Work\AtcRothData.cpp (616): AtcTransRoth.dll!CAtcRothData::LoadSchemaFromXml() + 0x13 bytes
    E:\Work\AtcRothData.cpp (34): AtcTransRoth.dll!CAtcRothData::LoadData() + 0x21 bytes
    E:\Work\ArtecRothDlg.cpp (207): ArtecRoth.exe!CArtecRothDlg::OnEnChangeMfceditbrowse1() + 0x41 bytes
    mfc140d.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;
};

运行再无内存泄漏。

六、结束

在编程是需要时刻观察内存泄漏信息,出现内存泄漏要及时处理。堆积时间越长,则越难处理,尤其在运行计算的大循环中,调式内存泄漏极其麻烦。

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

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

相关文章

OpenResty安装-(基于Nginx的高性能Web平台,可在Nginx端编码业务)

文章目录 安装OpenResty1.安装1&#xff09;安装开发库2&#xff09;安装OpenResty仓库3&#xff09;安装OpenResty4&#xff09;安装opm工具5&#xff09;目录结构6&#xff09;配置nginx的环境变量 2.启动和运行3.备注 安装OpenResty 1.安装 首先你的Linux虚拟机必须联网 …

【网络安全 --- 工具安装】Centos 7 详细安装过程及xshell,FTP等工具的安装(提供资源)

VMware虚拟机的安装教程如下&#xff0c;如没有安装&#xff0c;可以参考这篇博客安装&#xff08;提供资源&#xff09; 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&am…

高数:第三章:一元函数积分学

文章目录 一、不定积分(一)两个基本概念&#xff1a;原函数、不定积分(二)原函数的存在性&#xff1a;原函数存在定理(三)不定积分的性质(四)基本积分公式(五)三种主要积分法1.凑微分 (第一类换元法)2.换元法 (第二类换元法)①三角代换②根式代换③倒代换 3.分部积分法4.其他技…

工厂管理软件中的PLM管理

第一部分&#xff1a;介绍PLM管理的定义和背景 1.1 定义&#xff1a;PLM管理是指通过工厂管理软件实现对产品生命周期各个阶段的全面管理和协同合作&#xff0c;包括产品设计、工艺规划、生产制造、质量控制、供应链管理等环节。 1.2 背景&#xff1a;随着市场竞争的加剧和消…

希尔排序:优化插入排序的精妙算法

排序算法在计算机科学中扮演着重要的角色&#xff0c;其中希尔排序&#xff08;Shell Sort&#xff09;是一种经典的排序算法。本文将带您深入了解希尔排序&#xff0c;包括其工作原理、性能分析以及如何使用 Java 进行实现。 什么是希尔排序&#xff1f; 希尔排序&#xff0c…

数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

【Java 进阶篇】深入了解JDBCTemplate:简化Java数据库操作

数据库操作是几乎所有现代应用程序的一部分。从存储和检索数据到管理业务逻辑&#xff0c;数据库操作是不可或缺的。在Java应用程序中&#xff0c;JDBCTemplate是一种强大的工具&#xff0c;可帮助开发人员轻松进行数据库操作。本文将深入探讨JDBCTemplate&#xff0c;了解它的…

【MySQL】基本查询 (一)

文章目录 一. 基础查询二. where条件子句三. NULL的比较结束语 操作如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chinese float default 0.0 comment…

怒刷LeetCode的第24天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;反向遍历 方法二&#xff1a;字符串操作函数 方法三&#xff1a;正则表达式 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;模拟 方法二&#xff1a;递归 方法三&#xff1a;迭代 方法四&…

VS Code更改软件的语言

刚刚安装好的 vscode 默认是英文&#xff0c;可以安装中文扩展包。如图&#xff1a; 重启即可更换为中文。 如果想切换为英文&#xff0c;可以 Ctrl Shift P&#xff0c;打开命令面板。 输入 Configure DIsplay Language&#xff0c;如图&#xff1a; 可以在中英文之间切换…

【C语言】什么是宏定义?(#define详解)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 ​ 目录 一.什么是宏定义 二.宏定义的组成 第1部分 第2部分 第3部分 三.宏定义的应用 &#x1f38f;类对象宏 &#x1f38f;类函数宏 1.求两个数中的较大值 2.求一个数的…

【短文】在Linux中怎么查看文件信息

2023年10月6日&#xff0c;周五晚上 ls -l filename 通过这条命令可以简略地查看文件信息 stat filename 通过这条命令可以详细地查看文件信息

NFS 原理和配置

NFS 原理介绍 NFS network file system 网络文件系统 基于RPC协议&#xff0c;RPC remote procedure call 。 RPC存在的意义在于解决NFS服务端和客户端通信多端口并且端口不固定的问题。因为NFS的服务端和客户端通信的时候&#xff0c;并不是只有一个端口&#xff…

【云计算网络安全】DDoS 缓解解析:DDoS 攻击缓解策略、选择最佳提供商和关键考虑因素

文章目录 一、前言二、什么是 DDoS 缓解三、DDoS 缓解阶段四、如何选择 DDoS 缓解提供商4.1 网络容量4.2 处理能力4.3 可扩展性4.4 灵活性4.5 可靠性4.6 其他考虑因素4.6.1 定价4.6.2 所专注的方向 文末送书《数据要素安全流通》本书编撰背景本书亮点本书主要内容 一、前言 云…

电脑提示MSVCP100.dll丢失错误怎么解决?分享四个解决方法帮你搞定

在平时我们使用电脑中&#xff0c;经常会遇到各种问题&#xff0c;比如msvcp100.dll文件丢失&#xff0c;那这个msvcp100.dll文件丢失需要怎么修复解决呢&#xff1f;和msvcp100.dll为什么会丢失呢&#xff0c;下面我一点点为大家解答与介绍解决msvcp100.dll丢失问题的方法。 一…

什么,这年头还有人不知道404

写在前面 哥&#xff0c;来帮我看看&#xff0c;这个请求怎么404了&#xff0c;明明接口路径是对的啊&#xff01;一个下午&#xff0c;组里的小哥突然让我帮忙看这个问题&#xff0c;我不禁一惊&#xff0c;啥&#xff0c;这年头了还有人搞不定404&#xff0c;如有还有&#…

【二】spring boot-设计思想

spring boot-设计思想 简介&#xff1a;现在越来越多的人开始分析spring boot源码&#xff0c;拿到项目之后就有点无从下手了&#xff0c;这里介绍一下springboot源码的项目结构 一、项目结构 从上图可以看到&#xff0c;源码分为两个模块&#xff1a; spring-boot-project&a…

最强的电脑/手机/汽车/机器人芯片-2023

车规级芯片、手机芯片、电脑芯片比较_汽车芯片和电脑芯片的区别-CSDN博客 全文资源来源网络。 电脑&#xff1a; 图片引用。 CPU 基准测试性能层次结构根据性能对当前和上一代英特尔和 AMD 处理器进行排名&#xff0c;包括所有最适合游戏的 CPU。在 CPU 排名图表和表格下方&…

2023年【安全员-A证】报名考试及安全员-A证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新安全员-A证免费试题题目及答案&#xff01;多做几遍&#xff0c;其实通过安全员-A证作业考试题库很简单。 1、【多选题】2014年2月&#xff…

【亲测有效】C盘容量满了,给C盘扩容!!!

前言 相信有很多小伙伴用自己电脑的时候明明不往C盘装东西&#xff0c;但是C盘还是慢慢的变红了&#xff0c;我也是因为C盘满了而备受困扰。又不知道如何解决或者怕自己鼓捣着磁盘数据没了。闲来无事&#xff0c;我查了一些资料&#xff0c;终于将我的C盘容量扩充了且数据保存…