★6.3 Windows下MinGW项目的内存泄漏分析(基于Heob) Heob从名字上就能看出它与Qt的紧密联系。它本质上是一个内存调试助手专门为Windows平台上的Qt应用程序设计。它的最大优势在于深度集成。如果你打开Qt Creator在“分析”菜单下就能直接找到它的身影。这种开箱即用的体验对于Qt开发者来说极其友好。Heob的工作原理是在你的应用程序启动时通过环境变量注入一个动态库来拦截内存的分配和释放操作。因此它非常轻量对程序运行时的性能影响相对较小主要专注于检测未配对的new/delete或malloc/free也就是经典的内存泄漏。相比之下Dr.Memory的野心要大得多。它基于著名的DynamoRIO动态二进制插桩框架是一个功能全面的内存调试器。它的目标不仅仅是内存泄漏还包括一系列更底层、更棘手的内存错误例如越界读写访问了分配内存区域之外的数据。使用未初始化内存读取了未赋值的堆或栈内存。重复释放对同一块内存调用多次free或delete。不匹配的分配/释放例如用malloc分配却用delete释放。Dr.Memory通过动态重写应用程序的指令流来实现这些高级功能这带来了强大的检测能力但也意味着更高的运行时开销和更复杂的配置。简单来说你可以把Heob看作是一把精准的螺丝刀专门用来拧Qt程序内存泄漏这颗“螺丝”而Dr.Memory则是一个功能齐全的工具箱能处理各种内存相关的“疑难杂症”但操作起来可能需要更多的设置和知识。1、heob下载https://sourceforge.net/projects/heob/ 下载 heob-4.0.7z2、dwarfstack下载Releases · ssbssa/dwarfstack · GitHub 下载那个 dwarfstack-2.3-dlls.7z 文件。3、heob和dwarfstack放到一个目录4、配置heob的路径Heob path: 点击浏览heob64.exe 所在的文件目录。点击 OK 即可运行程序后关闭程序等几秒Memcheck 会列出可能内存泄露的文件 (有很多是误报需要仔细分辨)★6.3.1 Heob 控制台 4 个指令 on /off/clear /show 完整说明前置前提你在 Heob 配置里勾选了 Control leak recording On (Start Disabled)程序启动时默认不记录内存分配靠控制台按键手动控制录制区间精准抓「Zmq 连接 - 断开」这段泄漏。1. on快捷键 n开启泄漏录制作用开始捕获所有 new/malloc 内存分配、释放行为场景程序初始化完成、界面加载完毕后按 n 开启效果从此刻起所有堆内存操作全部存入日志后续只统计这段区间产生的泄漏适配你的场景连接 Zmq 之前按下 on只记录连接后的缓冲区分配。2. off快捷键 f关闭泄漏录制作用停止捕获新的内存分配记录已捕获的数据保留不删除场景执行完「断开 Zmq、释放 Worker」操作后按 off效果不再新增分配日志此时可以执行 show 导出当前快照对比前后内存差值关键点off 不会清空已有记录只是暂停采集。3. clear快捷键 c清空全部已捕获内存记录作用彻底删除 on 之后所有分配 / 泄漏数据重置统计典型用法一轮连接断开、导出快照后按 c 清空再按 on 开启开始下一轮重连测试优势多轮循环测试互不干扰每轮独立统计分配次数Blocks。4. show快捷键 s立刻导出当前快照到报告文件作用把当前已捕获、未释放的内存块写入 leaks.xml / leaks.html不用等程序退出核心价值针对你的持续泄漏不用关闭程序就能看当前泄漏总量、每条栈分配多少次连接后 show 一次断开后再 show 一次对比两次 Blocks 数值判断是否真的释放程序中途崩溃也能提前导出快照不会丢失数据。所以对于内存一直增长的问题。先清空、跑一会再on 开始记录★6.3.2 Heob 控制台输入s(show)后Qt Creator 不自动弹出 Memcheck 面板完整原因 修复核心前置知识点Qt Creator仅在程序完整退出时才会自动加载leaks.xml并弹出 Memcheck中途控制台执行show只是把快照写入 xml 文件IDE 不会自动感知、自动打开面板必须手动加载。最主要原因show 中途导出不会自动触发 Memcheck 弹窗机制限制Qt 官方文档明确show仅写入本地leaks.xmlIDE 无回调自动刷新视图只有关闭被测程序进程Heob 完全退出Qt 才会自动读取 xml 弹出 Memcheck。★6.3.3 Heob 查看同一堆栈分配次数完整方法核心关键必须开启 -g2 参数Heob 才会合并相同调用栈统一统计分配块数量、总泄漏字节。★6.3.4 分析这句话什么意思7168 bytes in 7 blocks are lost in loss record 1 of 1 (#20012)7168字节 在 7个块里面。看我的问题源码下面是一直循环申请内存。1024 * 7 7168