C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式.

当内存报错弹出一个陌生的地址,我一脸懵逼,不清楚是哪个地方出的错,特别是程序退出的时候报错更不好定位.可以使用第三方工具来定位解决,也可以自己想办法解决.

我在做神经网络训练的时候碰到一个的BUG,发送完训练图片之后直接提示使用了非法内存.


HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed.

代码迭代了多次,部分功能没有测试,也不清楚哪里出的问题.

联想到内存的申请释放方式,申请和释放总是配对的,申请的大小也是预先知道的.在内存申请申请释放的时候加上内存地址打印,当内存泄漏报错的时候就可以定位出错内存地址在哪个范围.我加入了一个内存打印函数,把内存地址范围和时间都打印出来.

void DebugHeap(CString name, void * ptr,int size)
{long Time = GetCurrentTime();TRACE("========>heap name:%s,address [%p:%p],time:%d (ms)\n", name,ptr,(char *)ptr + size,Time);
}

在程序中申请\释放部分加入DebugHeap

static Neural * mThis;
static FileInfo mFileInfo;
Neural *Neural:: GetInstance(MainDlg * parent,DlgCommand * cmd)
{if (mThis == NULL){mThis = new Neural(parent);mCmd = cmd;}return mThis;
}void Neural:: ReleaseInstance()
{if (mThis != NULL)delete mThis;
}Neural::Neural(MainDlg * parent)
{mFileInfo.mRcv = (unsigned char *)malloc(1024);DebugHeap("flag1:alloc", mFileInfo.mRcv, 1024);
}Neural::~Neural(void)
{bWork = FALSE;DebugHeap("flag1:free ", mFileInfo.mRcv, 1024);free(mFileInfo.mRcv);
}

程序运行中的日志

==>  ThreadRecvProc Start
==>  ThreadInterrupt Start
MainDlg::OnInitDialog()
========>heap name:flag1:alloc,address [0000015E95077CD0:0000015E950780D0],time:7870921 (ms)
“Test.exe”(Win32): 已加载“C:\Windows\System32\clbcatq.dll”。无法查找或打开 PDB 文件。
“Test.exe”(Win32): 已加载“C:\Windows\System32\edputil.dll”。无法查找或打开 PDB 文件。
....
线程 0x2a10 已退出,返回值为 0 (0x0)。
线程 0x2ae4 已退出,返回值为 0 (0x0)。
“Test.exe”(Win32): 已加载“C:\Windows\System32\mswsock.dll”。无法查找或打开 PDB 文件。
连接服务器成功!
线程 0x16c8 已退出,返回值为 96 (0x60)。
线程 0xa0c 已退出,返回值为 0 (0x0)。
“Test.exe”(Win32): 已加载“C:\Windows\System32\msctfuimanager.dll”。无法查找或打开 PDB 文件。
....
========>heap name:flag1:alloc,address [0000015E951577D0:0000015E95157BD0],time:7885500 (ms)
Ending:43707
========>heap name:flag1:free ,address [0000015E951577D0:0000015E95157BD0],time:7885609 (ms)
线程 0x2f20 已退出,返回值为 0 (0x0)。
========>heap name:flag1:alloc,address [0000015E950E4AA0:0000015E950E4EA0],time:7887265 (ms)
analyse:3, D:\数据\FSSD\V5\target.csv
========>heap name:flag1:free ,address [0000015E950E4AA0:0000015E950E4EA0],time:7887296 (ms)
线程 0x2a00 已退出,返回值为 0 (0x0)。
线程 0xe84 已退出,返回值为 0 (0x0)。
HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 modified at 0000015E950E4AA0 after it was freed
Test.exe 已触发了一个断点。

第一次申请 [0000015E95077CD0:0000015E950780D0]  释放失败

第二次申请[0000015E951577D0:0000015E95157BD0]   释放成功

第三次申请[0000015E950E4AA0:0000015E950E4EA0]  释放成功

从报错的意思看是重复释放内存.0000015E950E4AA0 地址被重复释放,这个地址刚好是第三次申请的地址.

看现象是第一次申请的地址被改动了,查看这部分代码分析原因.

按照我预想在构造函数申请内存,析构函数释放内存,是能配对.代码里加入单例模式并且使用了一个全局变量mFileInfo,随着构造函数调用会不断改变.我预想是这个类只能单例使用,由于历史原因,部分代码并没有使用单例模式.单例中的申请的地址位置被改动了,所以没办法正确释放.统一使用单例模式,这个问题解决了.

C++出现内存错误时候,把申请/释放的地址打印出来能更快更准确的定位到问题.

C++ 内存泄漏调试相关推荐

  1. Android之内存泄漏调试学习与总结

    大家有或经常碰到OOM的问题,对吧?很多这样的问题只要一出现相信大家的想法跟小马的一样,就是自己的应用:优化.优化.再优化!而且如果出现类似于OOM这样级别的问题,根本就不好处理,LogCat日志中显 ...

  2. delphi XE 下打开内存泄漏调试功能

    ReportMemoryLeaksOnShutdown := True; 能提供基本的内存泄漏信息,不是很详细. 转载于:https://www.cnblogs.com/gleam/archive/2 ...

  3. Android之内存泄漏调试学习与总结,完整PDF

    前言 今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟binder驱动交互,实现以最快的方式唤醒新的保活服务,最大程度防止保活失败.同时,我也将跟您分享,我是怎么做到在不 ...

  4. Android之内存泄漏调试学习与总结,分享PDF高清版

    前言 今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟binder驱动交互,实现以最快的方式唤醒新的保活服务,最大程度防止保活失败.同时,我也将跟您分享,我是怎么做到在不 ...

  5. 一次Java内存泄漏调试的有趣经历

    本文由 ImportNew - yizhe 翻译自 allegro.tech.欢迎加入翻译小组.转载请见文末要求. 人人都会犯错,但一些错误是如此的荒谬,我想不通怎么会有人犯这种错误.更没想到的是,这 ...

  6. 重磅消息!Java之内存泄漏调试学习与总结,分享PDF高清版

    前言 现在刷抖音经常可以看到一些老外街坊,问他们最想把什么带回自己的国家,我听过很多的回答都是:淘宝,支付宝,美食,微信,外卖,高铁等等. 确实如此,随着国家的快速发展吸引了不少国际上羡慕的目光,更让 ...

  7. centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)

    写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...

  8. 在vc2008中用_crtBreakAlloc调试内存泄漏

    在vc2008中用_crtBreakAlloc调试内存泄漏 2012-07-27 16:58:25 分类: C/C++ 这两天调一个程序,发现每次退出都有内存泄漏,在此总结一个调试内存泄漏的好方法. ...

  9. Visual Studio中检测内存泄漏的方法(一)

    有些内存泄露是不会dump出来详细信息的,只会给出内存块号,这种情况一下一般可以用一下方法调试出来. 这两天调一个程序,发现每次退出都有内存泄漏,在此总结一个调试内存泄漏的好方法. 对于比较明显的内存 ...

最新文章

  1. 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
  2. ssm上传文件获取路径_SSM文件上传
  3. Ruby中求50之内的素数方法
  4. JavaScript this 关键词
  5. 大话西游维护完怎么刷服务器,大话西游2很实用:看高玩教你如何快速刷齐高端套装...
  6. C++11常见新特性
  7. 在Session中放HashMap在Jsp中用JSTL遍历方法
  8. Spring(三) 表单页面处理
  9. 3d胆码计算机方法,3D选胆码方法公式汇总(近88期数据)
  10. 【MySQL5.7指南】第一章——概述
  11. Android 录制手机内部声音(screen recorder)framework层问题分析
  12. C++构造函数与类型转换explicit(大疆2018校招软件组考点之一)
  13. 杰理之GSENSOR【篇】
  14. 爱企查青龙可跑 一个月一张爱奇艺月卡最细教程
  15. Unity Monetization 3.0 部分接入文档内容
  16. SpringCloud Gateway 重试路由器的过滤器
  17. 微信页面触发返回按钮回到聊天界面
  18. 详解TCP/IP协议栈面临的五大网络安全问题
  19. winform 三层(BLL.DAL.MODEL)
  20. 剪刀石头布java_java编写剪刀石头布游戏

热门文章

  1. 南京计算机与软件学院,南京信息工程大学 计算机与软件学院 刘 琦
  2. L3-012 水果忍者 (30 分)
  3. m,mm,mmm区别
  4. web前端常用网址大全
  5. HTTP洪水Gong击网站-演示
  6. ROS 相关学习资源汇总
  7. php 图片压缩旋转,移动端图片上传旋转、压缩问题的解决方案
  8. 公安网络及计算机信息系统安全,违反公安网络和信息安全保密工作规定及公安机关有关公安网络、计算机和信息应用系..._考试资料网...
  9. 三维重建算法综述|传统+深度学习
  10. vc 2005 express使用