美文网首页
对象树(Object Tree)

对象树(Object Tree)

作者: 上官宏竹 | 来源:发表于2021-05-27 16:51 被阅读0次

什么是对象树?

我们常常听到 QObject 会用对象树来组织管理自己,那什么是对象树?
这个概念非常好理解。因为 QObject 类就有一个私有变量QList<QObject *>,专门存储这个类的子孙后代们。比如创建一个QObject 并指定父对象时,就会把自己加入到父对象的childre() 列表中,也就是 QList<QObject *> 变量中。

使用对象树模式有什么好处?

好处就是:当父对象被析构时子对象也会被析构。
举个例子,有一个窗口 Window,里面有 Label标签、TextEdit文本输入框、Button按钮这三个元素,并且都设置 Window 为它们的父对象。这时候我做了一个关闭窗口的操作,作为程序员的你是不是自然想到将所有和窗口相关的对象析构啊?古老的办法就是一个个手动 delete 呗。是不是很麻烦?Qt 运用对象树模式,当父对象被析构时,子对象自动就 delete 掉了,不用再写一大堆的代码了。
所以,对象树在 GUI 编程中是非常非常有用的。

注意:构建/析构 QObject 的顺序问题:最后被创建出来的会先被析构掉

正常情况

int main()
{
     QWidget window;
     QPushButton quit("Quit", &window);
}

后创建的 quit 对象指定了 window 为其父对象。那么关闭程序时,会先调用quit 对象的析构函数,然后调用 window 的析构函数,父window会先析构子类,但子类已析构不构成崩溃。

特殊情况

int main()
{
    QPushButton quit("Quit");
    QWidget window;
    quit.setParent(&window);
}

如果反过来,由于 window 后创建,程序关闭时先调用 window 的析构函数(此时子类 quit 被第一次析构)。接着调用 quit 的析构函数(此时 quit 被第二次析构),这时由于被两次析构,所以出问题了。

这种特殊情况在编程中很隐蔽,不容易发现。因为编译的时候不会报错,只有运行时才会产生问题。所以我们要保持良好的编程习惯以及对事物产生顺序有科学的认知。
Qt 中的对象树(Object Tree)

调试对象树

可以用QObject::dumpObjectTree()QObject::dumpObjectInfo() 来调试对象树。
qDebug("%s%s::%s %s", (const char*)buf, object->metaObject()->className(),name.toLocal8Bit().data(),flags.toLatin1().data());

源码解析

Qt父子对象内存管理实现简析

相关文章

  • git进阶 之 reflog

    示例 提交 git三大对象类型: 数据对象(Blob Object) / 树对象(Tree Object) / 提...

  • 对象树(Object Tree)

    什么是对象树? 我们常常听到 QObject 会用对象树来组织管理自己,那什么是对象树?这个概念非常好理解。因为 ...

  • 【学了就忘】Git原理 — 19.Git对象[tree对象](一

    1、Tree对象介绍 接下来要探讨的 Git 对象类型是树对象(tree object),它能解决文件名保存的问题...

  • QObject三大核心功能——内存管理

    信号与槽,内存管理,事件处理 QObject的parent or 对象树(Object Tree) QObject...

  • **git** 使用笔记

    git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...

  • 2019-10-25

    git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...

  • Unity3D自带功能:树物体(Tree)

    通过菜单GameObject > 3D Object > Tree可以为当前场景创建一个Tree (树),同时还会...

  • js-dom操作

    DOM是文档对象化模型(Document Object Model)的简称。DOM Tree是指通过DOM将HTM...

  • 07.JavaScript Html Dom

    DOM简介 DOM :Document Object Model 文档对象模型HTML DOM树 : DOM树模型...

  • Javascript

    文档对象模型DOM(Document Object Model) 文档树 documentHTMLHEADTITL...

网友评论

      本文标题:对象树(Object Tree)

      本文链接:https://www.haomeiwen.com/subject/xivmkltx.html