企业网站建设采购/连云港百度推广总代理

企业网站建设采购,连云港百度推广总代理,做房地产什么网站好,win2008做网站1. 什么是对象树? 对象树是一种基于父子关系的对象管理机制。在 Qt 中,所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时,子对象会被添加到父对象的内部列表中,形成一种树状结构。 Qt 提…
1. 什么是对象树?

对象树是一种基于父子关系的对象管理机制。在 Qt 中,所有继承自 QObject 的类都可以参与到对象树中。

当一个对象被设置为另一个对象的父对象时,子对象会被添加到父对象的内部列表中,形成一种树状结构。

Qt 提供了一个调试工具方法 dumpObjectTree() ,可以帮助开发者打印对象树的结构。

    QObject* parent = new QObject();QObject* child = new QObject();child->setParent(parent);parent->dumpObjectTree();

1.1 对象树结构

在 Qt 中,对象树的每个节点是一个 QObject 对象,而 “边” 代表父子关系。具体来说:

  • 根节点:没有父对象的对象(即 parent == nullptr)。
  • 子节点:有父对象的对象,它们会被添加到父对象的 子对象列表 中。
  • 叶子节点:没有子对象的对象。

grandparent 是根节点,parent 是 grandparent 的子节点,child 是 parent 的子节点,形成了一个三层的树形结构。

1.2 为什么选择 new 而不是栈上分配?

如果对象是在栈上创建的(如 局部变量),当作用域结束时,该对象会自动销毁。可能导致以下问题:

  • 如果子对象比父对象先销毁,父对象的 子对象列表 可能会指向无效内存。直观表现可能为:子对象区域显示为空白状态。

通过 new 创建对象,可以确保对象的生命周期由对象树管理,而不是由作用域控制。 这样可以避免上述问题。

2. 对象树的工作原理

在 Qt 中,继承自 QObject 的对象能够参与到对象树的前提是 该类必须正确地声明 Q_OBJECT

对象树通过以下两个关键成员变量实现:

  • QObject* parent :指向父对象的指针;
  • QList<QObject*> children:存储子对象的列表。

每个 QObject 对象可以有一个父对象 parent,和有多个子对象 children;子对象会被自动添加到父对象的 children 列表中。

2.1 对象创建时

当创建一个新的 QObject 对象并指定父对象时,会发生:

  1. 新对象的 parent 指针被设置为指定的父对象;
  2. 新对象被自动添加到父对象的 children 列表中。
2.2 对象销毁时

当一个对象被销毁时,以下操作会发生:

  1. 该对象的所有子对象会被递归销毁;
  2. 该对象从其父对象的 children 列表中移除。

​ Qt 的实现确保了在子对象的析构函数中,它会调用父对象的相关方法(如 QObjectPrivate::removeChild()),将自己从父对象的 children 列表中移除;显式移除子对象,是为了避免父对象的 children 列表中残留无效指针,从而确保对象树的完整性。

class MyObject : public QObject
{Q_OBJECT
public:QString name; // 对象名称explicit MyObject(QString name, QObject *parent) : name(name), QObject(parent) {}~MyObject(){qDebug() << name << " entering destructor.";if (parent()) {qDebug() << name << " is being removed from parent's children list.";}}
};void CreateObjects()
{MyObject* grandparent = new MyObject(QString("grandparent"));MyObject* parent = new MyObject(QString("parent"), grandparent);MyObject* child = new MyObject(QString("child"), parent);delete grandparent;
}

实际销毁顺序是:child -> parent -> grandparent —— 根据打印信息,child 开始析构时 parent 仍然存在。

3. 对象树的其它作用

在 Qt 中,对象树的核心作用是 简化对象的生命周期管理。通过对象树,开发者无需过多担心内存泄露或悬空指针等问题。

“简化对象的生命周期管理” 在 “工作原理” 部分已经解释过,除此之外,对象树的作用还包括:

3.1 层次化组织对象

​ 在 GUI 应用程序中,对象之间的关系通常是层次化的。例如,一个窗口可能包含多个控件,而每个控件又可能包含子控件。对象树提供了一种自然的方式来组织这些对象之间的关系。

int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
  1. Widget 是一个继承自 QWidget 的类,而 QWidget 又继承自 QObject。因此 Widget 对象可以参与到 Qt 的对象树机制中。

  2. 代码中 w 是一个在栈上分配的对象。

    如果用户手动关闭窗口(通过点击窗口的关闭按钮 或 调用 w.close()),窗口会被隐藏(调用了 hide() 方法),但 w 本身不会被销毁,因此它的子对象也不会被销毁 —— 栈上分配的对象由 C++ 的作用域管理,只有当作用域结束时(即 main() 函数返回时),w 才会被销毁。

  3. 设置 Qt::WA_DeleteOnClose

    Qt::WA_DeleteOnClose 是一个窗口属性,用于指示窗口在关闭时自动删除自身。如果设置了该属性,当用户手动关闭窗口时,w 会被销毁,并触发对象树的递归销毁。

    Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
    {ui->setupUi(this);// 设置关闭时自动销毁this->setAttribute(Qt::WA_DeleteOnClose);
    }
    
3.2 其它作用
  • 支持信号与槽机制:

    Qt 的信号与槽机制依赖于对象树来确保对象的生命周期一致性。

    如果一个对象被销毁,Qt 会自动断开与其相关的信号和槽连接;

    这一机制由 QObject 的析构函数触发,确保信号不会发送到已销毁的对象。

  • 简化资源管理:

    通过将资源封装成 QObject 的子类,并将其添加到对象树中,可以确保资源在父对象销毁时被正确释放。

    class FileWrapper : public QObject
    {Q_OBJECT
    public:FileWrapper(const QString& path, QObject* parent = nullptr): QObject(parent), file(path){}~FileWrapper(){file.close();}
    private:QFile file;
    };QObject* parent = new QObject();
    FileWrapper* file = new FileWrapper("test.txt", parent);
    
  • 提供遍历和查找功能:通过 QObject::children() 方法,可以获取某个对象的所有子类对象。

  • 避免重复释放:对象树通过集中管理对象的销毁过程,避免了重复释放的问题。

4. 注意事项
  • 避免循环引用:如果两个对象互相设置对方为父对象,会导致循环引用,从而引发内存泄露。

    解决方案: 确保父子关系是单向的。

  • 避免跨线程操作:如果父子对象位于不同的线程中,销毁顺序可能会受到线程调度的影响.

    QThread thread;
    QObject* obj = new QObject();
    obj->moveToThread(&thread);
    QObject* child = new QObject(obj);
    

    如果子对象在父对象销毁后仍然被访问(如 调用 child->parent() ),会导致未定义行为。

    解决方案:

    确保父子对象始终位于同一个线程;

    如果需要跨线程操作,可以使用信号与槽机制进行线程间通信,而不是直接操作对象树。

  • 避免手动干预销毁:如果手动调用 delete 销毁一个对象,而该对象同时参与对象树,可能会导致重复释放的问题。

    QObject* parent = new QObject();
    QObject* child = new QObject(parent);delete parent; // 自动销毁 child
    delete child;  // 再次销毁 child,重复释放
    

    解决方案:

    让对象树完全管理对象的生命周期,避免手动调用 delete ;

    如果必须手动管理对象,确保不将其添加到对象树中。

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

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

相关文章

JavaAPI(网络编程)

网络通信协议 通信协议 ‌所谓通信协议&#xff0c;是指通信双方在进行数据交换时必须遵守的规则和约定。‌这些规则确保了双方能够有效地进行通信&#xff0c;实现信息的交换和资源共享。通信协议定义了传输时的数据格式、控制信息以及传输顺序和速度等&#xff0c;确保双方…

Java---入门基础篇(下)---方法与数组

前言 本篇文章主要讲解有关方法与数组的知识点 ,是基础篇的一部分 , 而在下一篇文章我会讲解类和对象的知识点 入门基础篇上的链接给大家放在下面啦 ! Java---入门基础篇(上)-CSDN博客 感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 欢迎各位大佬指点…

Python 爬虫 – BeautifulSoup

Python 爬虫&#xff08;Web Scraping&#xff09;是指通过编写 Python 程序从互联网上自动提取信息的过程。 爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据&#xff0c;然后存储数据。 Python 的丰富生态使其成为开发爬虫的热门语言&#xff0c;特…

图像分类项目1:基于卷积神经网络的动物图像分类

一、选题背景及动机 在现代社会中&#xff0c;图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用&#xff0c;例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类&#xff0c;可以帮助人们更好地了解动物种类、数量和分布情况&#xff0c;…

PHP:IDEA开发工具配置XDebug,断点调试

文章目录 一、php.ini配置二、IDEA配置 一、php.ini配置 [xdebug] zend_extension"F:\wamp64\bin\php\php7.4.0\ext\php_xdebug-2.8.0-7.4-vc15-x86_64.dll" xdebug.remote_enable on xdebug.remote_host 127.0.0.1 xdebug.remote_port 9001 xdebug.idekey"…

【Java】使用jdk自带的zip压缩实现任意文件压缩打包下载功能(复制即用)

前言 在实际项目中&#xff0c;我们可能会接到将文件或者资料打包压缩导出的需求&#xff0c;例如将系统中某些生成的文件一起打包压缩下载提供给客户使用&#xff0c;今天提供一个jdk自带的工具类快速实现打包压缩的功能&#xff0c;方法我已经封装好&#xff0c;大家如果在项…

腾讯云扩容记录

腾讯云扩容&#xff1a; sudo yum install -y cloud-utils-growpart 安装扩容工具 sudo file -s /dev/vda1 有数据 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完毕 以下是对执行的命令的详细解释以及背后的原理&#xff1a; 1. 安装 cloud…

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…

使用DeepSeek+KIMI生成高质量PPT

一、使用DeepSeek DeepSeek官网&#xff1a;DeepSeek 点击“开始对话”&#xff0c;进入交互页面。 在上图中&#xff0c;输入问题&#xff0c;即可获取AI生成的结果。 基础模型&#xff08;V3&#xff09;&#xff1a;通用模型&#xff08;2024.12&#xff09;&#xff0c;高…

MySQL—使用binlog日志恢复数据

一、binlog日志恢复数据简介 在 MySQL 中&#xff0c;使用二进制日志&#xff08;binlog&#xff09;恢复数据是一种常见的用于故障恢复或数据找回的方法。以下是详细的使用步骤&#xff1a; 确认 binlog 已启用&#xff1a;首先需要确认 MySQL 服务器已经启用了二进制日志功…

VADv2: 基于矢量表征和概率规划的E2E架构

1. 写在前面 今天分享一篇自动驾驶领域的论文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率规划的E2E架构,2024年2月份华中科技大和地平线合作的一篇文章, 在经典的端到端模型架构上作出了基于概率规划去输出规划轨迹的…

NLP11-命名实体识别(NER)概述

目录 一、序列标注任务 常见子任务 二、 命名实体识别&#xff08;NER&#xff09; &#xff08;一&#xff09;简介 &#xff08;二&#xff09;目标 &#xff08;三&#xff09;应用场景 &#xff08;四&#xff09;基本方法 &#xff08;五&#xff09;工具与资源 一…

虚拟仿真无线路由器5G和2.4G发射信号辐射对比(虚拟仿真得出最小安全距离,与国际标准要求一致)

1、前言 有人说&#xff0c;只要有电磁波的地方就有辐射。5G和2.4G信号辐射强度是多少&#xff1f;是否会对人体构成危害&#xff1f;无线路由器的2.4GHz频段&#xff0c;频率范围&#xff1a;2.4 GHz 至 2.4835 GHz&#xff0c;信道宽度&#xff1a;通常为20 MHz&#xff0c;…

【数据挖掘】Matplotlib

Matplotlib 是 Python 最常用的 数据可视化 库之一&#xff0c;在数据挖掘过程中&#xff0c;主要用于 数据探索 (EDA)、趋势分析、模式识别 和 结果展示。 &#x1f4cc; 1. Matplotlib 基础 1.1 安装 & 导入 # 如果未安装 Matplotlib&#xff0c;请先安装 # pip instal…

DHCP配置实验

实验拓扑图 首先配置server的IP地址和网关 接下来配置R1 undo info-center enable dhcp enable //开启DHCP服务 ip pool dhcp-pool1 //开始配置dhcp地址池 gateway-list 192.168.1.254 //配置网关 network 192.168.1.0 mask 255.255.255.0 //配置网段和子网掩码 dns-list …

Linux:ELF文件-静动态库原理

✨✨所属专栏&#xff1a;Linux✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ ELF文件 什么是编译&#xff1f;编译就是将程序源代码编译成能让CPU直接执行的机器代码 如果我们要编译一个 .c文件&#xff0c;使用gcc -c将.c文件编译为二进制文件.o &#xff0c;如果一个项目有多个.…

Towards Graph Foundation Models: A Survey and Beyond

Towards Graph Foundation Models: A Survey and Beyond WWW24 ​#paper/⭐⭐⭐#​ #paper/&#x1f4a1;#​ 背景和动机 背景与意义 随着基础模型&#xff08;如大语言模型&#xff09;在NLP等领域的突破&#xff0c;图机器学习正经历从浅层方法向深度学习的范式转变。GFM…

基于 Python 深度学习的电影评论情感分析可视化系统(2.0 全新升级)

基于 Python 深度学习的电影评论情感分析可视化系统&#xff0c;基于 Flask 深度学习&#xff0c;构建了一个 影评情感分析系统&#xff0c;能够 自动分析影评、计算情感趋势 并 可视化展示&#xff0c;对于电影行业具有重要参考价值&#xff01; 基于 Python 深度学习的电影评…

Cargo, the Rust package manager, is not installed or is not on PATH.

今天在Windows操作系统上通过pip 安装jupyter的时候遇到这个报错&#xff0c;Cargo, the Rust package manager, is not installed or is not on PATH.。 解决办法 官网&#xff1a;https://rustup.rs/# 下载&#xff1a;https://win.rustup.rs/x86_64 安装完成之后&#xff0c…

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…