当前位置: 首页 > article >正文

【内存泄漏排查记】Qt子窗口未析构导致内存激增与程序崩溃

1. 内存泄漏现象初现那天我正在调试一个多通道数据显示的Qt程序主界面负责配置参数双击任意通道会弹出子窗口展示详细的时域频域图。测试阶段发现一个诡异现象程序运行时间越长就越卡最终直接崩溃。刚开始以为是GPU问题毕竟用了OpenGL渲染但任务管理器显示GPU占用率始终稳定在50%左右排除了这个可能性。接着我注意到任务管理器的内存监控曲线异常陡峭。程序启动时内存占用30MB连接网络后涨到70MB这都还算正常。但当我打开子窗口查看数据时内存瞬间突破100MB关闭子窗口后内存不仅没释放反而以1MB/s的速度持续增长。反复打开关闭几次后内存占用直接飙到1GB程序直接卡死崩溃。这种内存只增不减的现象明显是典型的内存泄漏。2. 排查过程全记录2.1 初步定位问题方向首先用Valgrind工具进行内存检测发现大量definitely lost的内存块。但Valgrind输出的调用栈信息过于底层难以直接对应到业务代码。于是改用Qt自带的内存分析工具export QT_LOGGING_RULESqt.memory.debugtrue ./myapp 21 | grep -i memory日志显示每次创建子窗口时都会新增QWidget对象但关闭窗口时却没有对应的删除记录。这验证了内存泄漏的存在但还需要进一步定位具体原因。2.2 关键线索发现在查阅资料时一篇关于Qt窗口析构的博客点醒了我。原来Qt窗口默认关闭行为只是隐藏(hide)并非真正销毁。需要在子窗口构造函数中添加this-setAttribute(Qt::WA_DeleteOnClose);这个属性会确保窗口关闭时自动调用析构函数。实测发现加上这行代码后每次关闭子窗口内存都会回落到正常水平。3. 技术原理深度解析3.1 Qt对象树管理机制Qt通过父子对象树自动管理内存父对象销毁时会递归销毁所有子对象。但窗口关闭事件比较特殊默认行为close()只是隐藏窗口对象依然存在设置WA_DeleteOnClose后close()会触发deleteLater()手动delete直接调用delete会立即销毁对象graph TD A[关闭窗口] --|默认行为| B[仅hide] A --|WA_DeleteOnClose| C[deleteLater] A --|手动调用| D[立即delete]3.2 内存泄漏的具体表现在我的案例中每次打开子窗口分配新内存创建QWidget、QChart等对象未设置WA_DeleteOnClose时关闭窗口不释放内存重复操作导致内存堆积最终结果可用内存耗尽程序崩溃4. 完整解决方案4.1 代码修改方案在子窗口类的构造函数中添加关键属性设置MyChildWindow::MyChildWindow(QWidget *parent) : QWidget(parent) { // 必须设置的属性 this-setAttribute(Qt::WA_DeleteOnClose); // 其他初始化代码 initUI(); setupChart(); }4.2 验证方法使用以下方法验证内存释放是否正常在子窗口析构函数中添加日志MyChildWindow::~MyChildWindow() { qDebug() Child window destroyed; }监控内存变化while true; do ps -p $(pgrep myapp) -o %mem; sleep 1 done预期结果每次关闭子窗口都应看到内存下降并在日志中看到析构信息。5. 其他可能的内存泄漏场景5.1 信号槽连接未断开如果使用lambda表达式连接信号槽要注意对象生命周期// 错误示例可能导致内存泄漏 connect(source, QObject::signal, [](){ this-doSomething(); }); // 正确做法使用QPointer或弱引用 QPointerMyClass guard(this); connect(source, QObject::signal, [guard](){ if(guard) guard-doSomething(); });5.2 静态对象持有引用静态容器持有QObject指针会导致对象无法释放// 全局容器 static QListQWidget* widgetList; void addWidget(QWidget* w) { widgetList.append(w); // 危险 }解决方案是改用弱引用或定期清理。6. 高级调试技巧6.1 使用QtCreator内存分析器启动Analyze-QML Profiler选择Memory Usage视图重点关注不断增长的QObject对象未释放的QPixmap等资源6.2 自定义内存跟踪在qDebug输出中显示内存分配信息#define DEBUG_MEMORY qDebug() Allocated at: __FILE__ __LINE__ class MyObject : public QObject { public: MyObject(QObject* parentnullptr) : QObject(parent) { DEBUG_MEMORY; } ~MyObject() { qDebug() Destroyed at: QDateTime::currentDateTime(); } };7. 最佳实践建议所有QDialog和子窗口都应设置WA_DeleteOnClose使用QPointer代替裸指针存储QObject引用定期用Valgrind或QtCreator分析工具检查内存在析构函数中添加资源释放日志避免在静态对象中持有QObject指针我在项目中实施这些规范后内存泄漏问题再未出现。特别是将WA_DeleteOnClose设为团队编码规范后类似问题从根源上得到了预防。

相关文章:

【内存泄漏排查记】Qt子窗口未析构导致内存激增与程序崩溃

1. 内存泄漏现象初现 那天我正在调试一个多通道数据显示的Qt程序,主界面负责配置参数,双击任意通道会弹出子窗口展示详细的时域频域图。测试阶段发现一个诡异现象:程序运行时间越长就越卡,最终直接崩溃。刚开始以为是GPU问题&…...

别再手动敲命令了!用Docker Compose在Ubuntu虚拟机里5分钟搞定MinIO单机部署

5分钟极速部署MinIO:Docker Compose在Ubuntu虚拟机的优雅实践 MinIO作为高性能对象存储的代表,已经成为开发者和运维团队构建私有云存储的首选方案。但传统的手动安装方式往往需要处理各种依赖和环境配置,耗费大量时间且容易出错。本文将带你…...

Unity Shader实战:从顶点到片元,手把手教你打造第一个自定义水波纹效果

Unity Shader实战:从顶点到片元,手把手教你打造第一个自定义水波纹效果 在游戏开发中,水面效果一直是提升场景真实感的关键元素之一。想象一下,当玩家走过一片湖泊,水面泛起细腻的波纹,阳光在水面上跳跃&am…...

GLM-4-9B-Chat-1M效果展示:1M上下文下多文档交叉引用关系自动构建演示

GLM-4-9B-Chat-1M效果展示:1M上下文下多文档交叉引用关系自动构建演示 想象一下,你手头有十几份研究报告、几十页的合同文档,或者一个包含数百个文件的代码库。你想快速理清这些材料之间的关联:哪份报告引用了另一份的数据&#…...

2026年专业的昆明装修公司排行榜出炉!

在昆明,装修是许多业主的大事,但市场上的装修公司参差不齐,让业主们头疼不已。今天,我们就来深入分析一下昆明的装修市场,为大家推荐靠谱的装修公司,其中首推34年昆明本土老牌——渤竣装家汉。业主装修痛点…...

前端响应式设计新趋势:别再用媒体查询了

前端响应式设计新趋势:别再用媒体查询了 什么是前端响应式设计新趋势? 前端响应式设计新趋势是指在前端开发中,随着技术的发展和设备的多样化,出现的新的响应式设计方法和策略。别以为响应式设计只是使用媒体查询,那是…...

DeepSeek-OCR-2保姆级教程:小白也能搞定复杂表格和标题的精准识别

DeepSeek-OCR-2保姆级教程:小白也能搞定复杂表格和标题的精准识别 1. 为什么需要智能OCR工具? 在日常办公中,我们经常遇到这样的场景:收到一份扫描版的合同或报告,里面包含复杂的表格和多级标题,需要手动…...

AIAgent持续学习落地失败的7个隐性雷区(SITS2026闭门研讨会未公开纪要·仅限本次释放)

第一章:AIAgent持续学习的范式跃迁与现实断层 2026奇点智能技术大会(https://ml-summit.org) 传统机器学习系统依赖静态数据集与离线训练闭环,而现代AIAgent需在开放环境中边执行、边感知、边修正知识结构——这一能力要求正驱动持续学习从“模型微调”…...

HY-Motion 1.0惊艳效果:同一prompt多次生成结果多样性与可控性平衡

HY-Motion 1.0惊艳效果:同一prompt多次生成结果多样性与可控性平衡 1. 不是“随机抖动”,而是有章法的律动自由 你有没有试过输入同一句提示词,比如“A person walks confidently forward with arms swinging naturally”,却得到…...

第二十一章 项目启动与治理架构:从招标到甲乙方协作机制的建立

第四篇 项目交付与工程管理写代码是工程,交付是艺术与政治的混合体。 第四篇解决的是一个在技术书籍里经常被回避的核心问题:如何在复杂的国企环境、多供应商格局和真实的一线压力下,把一个工业互联网系统真正交到用户手里,并让它…...

基于Anaconda的OFA图像英文描述模型开发环境搭建

基于Anaconda的OFA图像英文描述模型开发环境搭建 1. 环境准备与Anaconda安装 如果你还没安装Anaconda,先去官网下载适合你操作系统的版本。Windows用户直接运行exe安装包,Linux和Mac用户用命令行安装就行。安装过程很简单,基本上就是一路下…...

Python asyncio 并发任务分发机制

Python asyncio并发任务分发机制解析 在当今高并发的网络应用中,如何高效处理大量I/O密集型任务成为开发者关注的焦点。Python的asyncio库通过事件循环和协程机制,提供了一种轻量级的并发解决方案。与传统的多线程相比,asyncio避免了线程切换…...

Qwen3.5推理模型实战体验:手把手教你搭建个人AI代码助手

Qwen3.5推理模型实战体验:手把手教你搭建个人AI代码助手 1. 为什么选择Qwen3.5-4B推理模型 在众多开源大模型中,Qwen3.5系列以其出色的中文理解和推理能力脱颖而出。今天我们要体验的是Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF版本&#…...

DMA2D 加速 LVGL 渲染:从基础配置到性能优化实战

1. DMA2D硬件加速器基础解析 第一次接触STM32的DMA2D控制器时,我被这个外设的名字搞糊涂了——明明叫"DMA",却专门处理图形操作。后来在STM32F746G-DISCO开发板上实测才发现,这个Chrom-ART加速器简直是嵌入式GUI的性能救星。简单来…...

告别重复造轮子:用 Codex 自动生成脚本,效率提升 300%

当你可以用自然语言描述需求,让 AI 在 5 秒内生成可运行脚本时,为什么还要花 30 分钟手动编写重复性代码? 引言:编程生产力的新范式 在日常开发工作中,有多少时间被浪费在编写重复性脚本上?文件批量重命名、…...

Zigbee无线传感网络:驱动精准农业落地的关键技术实践

1. Zigbee技术如何成为精准农业的"神经末梢" 想象一下,当你走进一个现代化农场,看不到杂乱的电线,却能实时掌握每块田地的土壤湿度、温度、光照强度——这就是Zigbee无线传感网络创造的奇迹。作为农业物联网的"神经末梢"…...

低浓度瓦斯处理痛点破解|GC-BLOCK瓦斯热电系统实测分享

作为深耕低浓度瓦斯利用设备领域5年的从业者&#xff0c;先后走访50煤矿现场&#xff08;山西吕梁、陕西榆林、内蒙古鄂尔多斯等&#xff09;&#xff0c;接触过各类瓦斯处理项目&#xff0c;深知煤矿低浓度瓦斯&#xff08;浓度<8%&#xff09;处理的核心痛点与行业困境。近…...

Qwen3-0.6B-FP8部署教程:防火墙/代理环境下离线模型加载解决方案

Qwen3-0.6B-FP8部署教程&#xff1a;防火墙/代理环境下离线模型加载解决方案 你是不是也遇到过这种情况&#xff1a;想在公司内网或者网络受限的环境里部署一个大模型&#xff0c;结果第一步下载模型就卡住了&#xff1f;要么是网络代理设置太复杂&#xff0c;要么是防火墙直接…...

构建可泛化多模态底座的48小时攻坚实录:含23个真实标注冲突案例与自动修复脚本(限前500名领取)

第一章&#xff1a;多模态大模型训练数据构建策略的范式演进 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型的数据构建已从早期人工标注与规则驱动&#xff0c;跃迁至以自监督对齐、跨模态蒸馏和合成反馈闭环为核心的协同演化范式。这一演进不仅反映在数据规模的…...

模型遗忘率下降72%、任务适应速度提升8.3倍,SITS2026披露AIAgent持续学习的5个工业级关键技术,限内部技术白皮书同步解禁

第一章&#xff1a;SITS2026演讲&#xff1a;AIAgent的持续学习 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026主会场&#xff0c;来自MIT与DeepMind联合实验室的研究团队展示了AIAgent持续学习框架CLIP-Loop&#xff0c;该框架突破了传统微调范式对静态数据集的依…...

Leather Dress Collection 开源模型社区贡献指南:从使用到反馈

Leather Dress Collection 开源模型社区贡献指南&#xff1a;从使用到反馈 你是不是已经用Leather Dress Collection生成了一些很酷的皮革服装设计图&#xff0c;觉得这个模型挺有意思的&#xff1f;有没有想过&#xff0c;除了用它&#xff0c;你还能为这个项目做点什么&…...

爱毕业aibiye等9款免费查重工具,支持AI智能降重,每日检测次数无限制

核心工具对比速览 工具名称 查重速度 降重效果 特色功能 适用场景 aicheck 极快 重复率可降30% 专业术语保留 高重复率紧急处理 aibiye 中等 逻辑优化明显 学术表达增强 提升论文质量 askpaper 快 结构保持完整 多语言支持 外文论文降重 秒篇 极快 上下文…...

【AIAgent架构混沌工程实战白皮书】:20年SRE专家亲授5大高危故障注入模式与3类生产级熔断验证框架

第一章&#xff1a;AIAgent架构混沌工程实战白皮书导论 2026奇点智能技术大会(https://ml-summit.org) AIAgent系统正从单体推理服务演进为多智能体协同、动态编排、跨模态感知的复杂运行时生态。其架构天然具备高耦合性、强状态依赖与非确定性决策特征&#xff0c;传统测试手…...

2026奇点大会闭门报告流出:图像描述生成正面临“语义坍缩”危机,这4类业务场景已触发告警

第一章&#xff1a;2026奇点智能技术大会&#xff1a;图像描述生成 2026奇点智能技术大会(https://ml-summit.org) 核心任务与技术演进 图像描述生成&#xff08;Image Captioning&#xff09;在2026奇点智能技术大会上被确立为多模态理解的关键落地范式。本届大会展示的最新…...

Step3-VL-10B-Base模型部署避坑指南:解决C盘空间不足与依赖冲突

Step3-VL-10B-Base模型部署避坑指南&#xff1a;解决C盘空间不足与依赖冲突 最近有不少朋友在尝试部署Step3-VL-10B-Base这个视觉语言大模型时&#xff0c;遇到了两个特别头疼的问题。一个是刚跑起来没多久&#xff0c;C盘就飘红了&#xff0c;系统提示空间不足&#xff1b;另…...

多模态大模型服务化落地失败率高达73%(Gartner 2024实测数据):你踩中的第4个架构陷阱可能正在拖垮AI产品上线周期

第一章&#xff1a;多模态大模型服务化落地的现实困局与架构反思 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在实验室中展现出卓越的跨模态理解与生成能力&#xff0c;但一旦进入生产环境&#xff0c;其服务化路径便暴露出显著断层&#xff1a;计算资源高消耗…...

从SQL到Self-Healing Agent:2026奇点大会披露的AIAgent数据分析演进路线图,错过再等三年

第一章&#xff1a;从SQL到Self-Healing Agent&#xff1a;AIAgent数据分析的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统SQL驱动的数据分析依赖人工编写查询、预设schema和静态ETL流程&#xff0c;当数据源变更、字段语义漂移或业务逻辑升级时&#xff0c;系…...

软件代理管理中的访问控制层

软件代理管理中的访问控制层是确保系统安全与合规性的核心组件。随着数字化转型加速&#xff0c;软件代理广泛应用于自动化任务、数据采集和跨系统交互&#xff0c;但其开放性和灵活性也带来了潜在风险。访问控制层通过精细化权限管理&#xff0c;成为平衡效率与安全的关键技术…...

unity urp材质球大全

Unityurp>PBRMaterialBundleVol1-1资源-CSDN下载 Unityurp>PBRMaterialBundleVol1-2资源-CSDN下载...

【应用层-E-mail电子邮件服务】

应用层-E-mail电子邮件服务一、概念二、协议三、过程一、概念 1.电子邮件就是在网络上收发信件的服务&#xff0c;靠一套协议完成收发、存储、中转。 2.用户代理&#xff08;客户端&#xff09;&#xff1a;Outlook、Foxmail、手机邮箱 APP 3.邮件服务器&#xff1a;负责接收、…...