(六)Qt内存管理

QSqlQuery内存问题分析及解决 在关闭数据库之前,必须使用QSqlQuery.finish()或QSqlQuery.clear。否则,Query对象中会遗漏剩余内存。线程中使用的QSqlQuery需要提升为类成员。创建QSqlQuery变量作为指针,并在关闭数据库之前删除此指针 阅读详情

父子关系:

所有指定了父对象的Qt对象(继承自QObject类的实例)与其父对象间存在父子关系:

每个Qt对象都保存有指向其所有子对象的指针

每个Qt对象都有一个指向其父对象的指针


当指定(通过构造函数指定,或通过setParent函数)Qt对象的父对象时:

其父对象会在子对象链表中加入指向该对象的指针

该对象会保存指向其父对象的指针

 

当Qt对象被销毁时

该对象会将自己从父对象的子对象链表中移除

该对象会将自己的子对象链表中所有子对象销毁

 

通过父子关系得到Qt对象树,删除树中的节点时会导致对应的子树被销毁

 

设置属性:

如:QWidget及其子类对象,可以设置Qt:: WA_DeleteOnClose,此后,当被close时便自动销毁(delete)

 

使用函数QObject类的成员函数deleteLater():

使用此函数后销毁操作不会立即执行,而是当Qt对象返回事件循环时执行销毁操作(如果事件循环未开始,将立即执行销毁操作),多次调用此函数是安全的

 

注意:

(1)想要设置Qt::WA_DeleteOnClose,被设置对象必须位于堆,否则触发delete时会作用在栈上,程序将会崩溃

(2)、尽量依靠Qt对象间的父子关系销毁对象,不要手动去delete。正常情况下,发生delete时,被delete的父对象会知道这个事情,并会将被delete的子对象从其子对象链表移除,但如果一个Qt对象正在接受事件队列的中途被delete,结果可能是内存的多次释放,如果一定要销毁,使用deleteLater()

(3)、尽量不要在一个Qt对象的父对象之外持有指这个Qt对象的指针,因为这个指针在某些时刻指向的Qt对象可能已经被销毁,应该使用智能指针QPointer(此指针会在其指向的Qt类对象(只能指向QObject及其子类对象)被销毁时自动置NULL)

(4)、注意一个因为父子关系而引出的问题:

#include <QtGui>

 

int main(int argc, char *argv[])

{

         QApplicationa(argc, argv);

        

         QLabellabel("Hi");

         QWidgetw;

        

         label.setParent(&w);

         w.show();

        

         returna.exec();

}

问题在于:退出时w比label先析构,w是label的父对象,由于父子关系,w析构时,其操作之一是销毁子对象(执行delete),而label是栈对象,这一动作将导致程序崩溃,解决办法(1)、使label对象在堆上创建

(2)、确保label比w先被析构,label会将自己从w的子对象链表中移除,w析构时其子对象链表中已经不存在label

将代码的顺序改为:

QWidget w;

QLabel label("Hi");

 

 

 

 

 

 

 声明:

此文根据 狄泰学院唐老师的《QT实验分析教程》创作,并根据自身理解对其进行了少许的扩展

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Qt内存管理(一) 半自动内存管理机制 概述 看多了Qt的代码就会发现,很多人的代码里大量使用new,却很少看到delete,以至于我刚学Qt时也养成了这个习惯,在写C++时也不用delete,结果造成很多麻烦。 原因在于Qt采用半自动的内存管理,不像c++那种全需要自己delete堆内存对象。Qt对象继承自QObject, QObject内部有一个list,会保存children,即QObjectList* children;还有... 阅读详情

相关推荐

QT内存管理

QT内存管理QObjectQT半自动化的内存管理方式一:方式二:方式三:方式四: QObject QObject是 QT最基础和核心的类。其内部有一个list,会保存children,还有一个指针保存parent,当自己析构时,会自己从parent列表中删除并且析构所有的children。 QT对象之间可以存在父子关系,每一个对象都可以保存它所有子对象的指针,每一个对象都有一个指向其父对象的指针。 注:子界面的parent并不一定是构造子界面时的参数parent;如下 #include <QtWidg

weixin_54354418的博客 1117

【python】QWidget父子关系,控件显示优先级原理剖析与应用实战演练

在Qt中,QWidget及其子类是用于界面构建的基本单元。每个QWidget对象都可以有一个父对象,而在这个父对象的children()列表中,也能找到这个子对象。当父对象被销毁时,它的所有子对象也会被销毁。 在PyQt中,QWidget的层级控制允许对不同的QWidget进行层级关系的调整,从而决定它们在屏幕上的显示顺序。

景天科技苑 1万+

QT(二)QT常用类 内存管理机制

QObject的介绍 QWidget的介绍 QString的介绍 QT内存管理机制 内存管理的概念 QT对象树

Ares悟道的博客 773

QT学习笔记07QWidget(对象模型)

所有窗口及窗口控件都是从QWidget直接或间接派生出来的。在Qt中创建对象的时候会提供一个Parent对象指针,下面来解释这个parent到底是干什么的。 QObject是以对象树的形式组织起来的。当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。 这相当于,在创建QObject对象时,可以提供一个其

lzjsqn的专栏 696

Qt的内存管理机制

当我们在使用Qt时不可避免得需要接触到内存的分配和使用,即使是在使用Python,Golang这种带有自动垃圾回收器(GC)的语言时我们仍然需要对Qt的内存管理机制有所了解,以更加清楚的认识Qt对象的生命周期并在适当的时机加以控制或者避免进入陷阱。这篇文章里我们将学习QObject & parent对象管理机制,以及QWidget与内存管理这两点Qt的基础知识。

QtCompany的博客 880

深入探索C++与Qt中的内存管理:从原理到实战

本文全面介绍了C++与Qt的内存管理技术,包括C++内存区域划分、智能指针使用、RAII模式,以及Qt特有的对象树机制和deleteLater安全删除方法。文章深入剖析了常见内存问题类型及解决方案,提供了Qt内存检测工具的使用指南,并总结了UI组件、非UI资源等场景下的最佳实践。通过实际案例展示了智能指针管理对话框和高效数据处理的方法,最后探讨了自定义内存管理的高级话题,帮助开发者构建更稳定高效的应用程序。

qq_39562273的博客 886

Qt 提供了一种方便的内存管理机制,主要通过对象树(QObject 的父子关系)来实现

是内存管理的核心机制之一。这种机制通过构造一个对象树,当父对象销毁时,会自动销毁其所有子对象,从而实现子对象内存的自动管理。,通过父子关系形成的对象树,在对象销毁时自动释放子对象的内存,大幅简化了内存管理的复杂性。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 339

QT的内存管理

QT文章列表 Qt完善了C++的内存管理机制 如果指针对象有父对象,那么父对象在被释放时,会自动释放子对象 所以,像一些菜单什么的,不管有多少父子关系,都不用担心释放,只需要一层一层的设置parent就行,QT的类要求构造函数必须要传一个explicit的QObject*指针就是这个意思: Q_INVOKABLE explicit QObject(QObject *parent=...

C++ 爱好者 make_it_simple888 1584

Qt的内存管理

Qt内存管理,智能指针,对象树系统,QPointer

zw_ggr_2017的博客 1411

方案设计之亿级排行榜方案设计

该方案通过 “Redis Zset 为核心 + 分治策略为骨架 + 多级优化为细节”,在亿级用户场景下实现了:本质是将 “亿级大问题” 拆解为 “千万级小问题”,用分布式思想和精细化设计平衡性能、可用性与成本。

shine0312的专栏 1100

Unity Shader学习笔记/Urp/水墨风效果

Unity Shader学习

qq_63133691的博客 2117

【QT入门】 Qt内存管理机制详解

【QT入门】 Qt内存管理机制详解

LF__plus的博客 2391

FPGA时序约束:从时钟树到数据路径的深度解析与优化策略

本文深入解析FPGA时序约束的核心技术与优化策略,涵盖时钟树结构分析、时序报告解读和数据路径优化。重点探讨Vivado工具中的时序约束方法,包括时钟定义、异常约束和物理优化,帮助工程师掌握寄存器级时序分析和系统级协同设计,实现高性能FPGA设计。

u5v6w7的博客 652

QT QT内存管理

QSharedPointer 的主要作用是: 所有权管理: 当一个 QSharedPointer 指向的对象 不再被任何其他 QSharedPointer 引用时, 即所有指向该对象的 QSharedPointer 都变为空, 它会自动调用对象的析构函数, 从而释放分配给该对象的内存。而QWeakPointer可以避免这种情况, 因为即使一个对象被另一个对象 通过QWeakPointer间接引用, 只要没有直接的强引用存在, 该对象仍然会被垃圾回收。在作用范围B中, 定义了嵌套的作用范围C。

QT WIDGETS,QT QML,QT WEB、OpenCV 1979

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1653

QCC304x系列开发教程(基础篇)之2.1-QCC3040之开发环境搭建

一、安装MDE 1.解压qualcomm_mde.win.2.4_installer_2.4.1.4压缩包,安装MDE_WIN_2.4.1.4_x64.exe,路径自定义 点击NEXT, 安装完成后,点击Finish. 完成安装后,桌面生成快捷方式

心跳包的博客 6079

Qt开发:Qt的内存管理机制

Qt提供了一套完善的内存管理机制,主要基于父子对象关系和智能指针等方式,开发者只需正确建立父子关系,无需担心子对象的内存泄漏问题。

倔强老吕的博客 1484

Altium Designer (AD) 设计软件高频面试题及参考答案(3万字长文)

在Altium Designer(AD)中,设计复用是一种关键的策略,它允许设计师在多个项目中重复使用经过验证的设计元素,如原理图符号、PCB布局、元器件封装和设计规则集。在Altium Designer (AD) 中,手动布线和交互式布线是PCB设计中常见的两种布线模式,它们提供了设计师对布线路径的直接控制,特别是在处理复杂或关键信号路径时尤为有用。在Altium Designer (AD) 中进行电路级仿真是一项重要的设计验证步骤,它允许设计师在实际制造之前对电路的行为进行预测和分析。

大模型大数据攻城狮的专栏 4782

深入理解Qt对象树内存管理

深入理解Qt对象树内存管理

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3343

手把手教你学simulink(26.8)--控制算法场景示例:基于强化学习的无人机姿态稳定控制系统

首先,我们需要定义无人机的姿态稳定控制环境。环境包括无人机的状态(姿态角、角速度等)和动作(电机转速)。我们还需要定义奖励函数,用于评估控制器的表现。matlab深色版本% 定义环境% 定义状态空间% 12个状态变量% 定义动作空间% 电机转速范围奖励函数用于评估控制器的表现。我们可以根据无人机的姿态误差、角速度误差以及控制输入的变化率来设计奖励函数。具体来说,当无人机的姿态接近设定值时,给予正奖励;当姿态误差较大或控制输入变化剧烈时,给予负奖励。matlab深色版本。

MHD0815的博客 496

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【精华】详解Qt中的内存管理机制

前言 内存管理,是对软件中内存资源的分配与释放进行有效管理的方法和理论。 众所周知,内存管理是软件开发的一个重要的内容。软件规模越大,内存管理可能出现的问题越多。如果像C语言一样手动地管理内存,一会给开发人员带来巨大的负担,二是手动管理内存的可靠性较差。 Qt为软件开发人员提供了一套内存管理机制,用以替代手动内存管理。 下面开始逐条讲述Qt中的内存管理机制。 一脉相承的栈与堆的内存管理 了解C语言的同学都知道,C语言中的内存分配有两种形式:栈内存、堆内存。 栈内存 栈内存的管理是由编译器来做的,栈上申请的内

撬动未来的支点的专栏 7407

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

QT 内存管理深度解析

T 框架在 C++ 的基础上提供了更高级的内存管理机制,帮助开发者减少手动管理内存的负担,同时避免常见的内存泄漏、野指针等问题。以下是 QT 内存管理的核心机制和最佳实践。QT 的 及其派生类(如 、 等)采用对象树机制自动管理内存:父对象析构时,自动删除所有子对象(递归删除)。通过 或在构造函数中指定父对象建立关系。适用于 GUI 组件、信号槽对象等。 优点:无需手动 子对象,减少内存泄漏风险。适用于 GUI 程序,窗口关闭时自动清理所有子控件。缺点:循环引用可能导致内存泄漏(如父子互相引用)。

weixin_43050542的博客 1323

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: (四)初探信号与槽
下一篇: (七)计算器实例
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值