代码之家  ›  专栏  ›  技术社区  ›  Mathieu Shrikanth M D

是否应该对成员对象调用析构函数[重复]

  •  -2
  • Mathieu Shrikanth M D  · 技术社区  · 8 年前

    查看Qt示例时(在Qt文档中,如 movieplayer example here ),我从未看到显式调用成员析构函数。

    类定义如下:

    class foo : public QParent {
        Q_OBJECT
        QStuff stuff;
        foo (QWidget *parent) : QParent(parent)
        {
             stuff = new QStuff(this);
        }
    }; 
    

    我的问题是我从来没见过这样的东西 delete stuff;

    所以我的问题是:

    • QObject 派生类实例 parent 不是 NULL 当其父级为时自动删除?

    • 删除 Q对象 未将其设置为的派生成员 无效的 ?

    我想答案是肯定的和否定的,但我不确定。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Gabriella Giordano    8 年前

    对于第一个问题,是的。您可以查看Qt文档 here 如果明确说明:

    QObject在对象树中组织自己。当您创建 QObject与另一个对象作为父对象时,该对象将自动 将其自身添加到父级的子级()列表中。父母拥有所有权 对象的名称;i、 例如,它将在其 析构函数。可以按名称和可选类型查找对象 使用findChild()或findChildren()。

    对于第二个问题,答案需要更多的解释。如果QObject指针成员不是对象的子对象,则必须在类的析构函数中手动处理它们的处理。

    理论上你可以使用 delete 在任何QObject*上调用其析构函数,但由于Qt对象具有基于信号/插槽的强大事件系统,因此您必须了解与事件循环的交互。如果在另一个QObject仍在处理来自第一个QObject的信号时,残酷地删除连接到另一个QObject的QObject,则可能会出现一些问题。

    这适用于单线程和多线程应用程序。因此,应避免使用 删去 赞成 QObject::deleteLater() 这将推迟QObject的删除,直到处理完与它相关的所有信号/插槽。

    最后,在析构函数实现的上下文中,如果将指针设置为null实际上并不重要,因为它无论如何都不可供进一步使用。如果在实例仍处于活动状态时删除其他方法中的指针对象,并将指针设置为null以将其标记为未初始化,则这可能很重要。

        2
  •  1
  •   Paul Floyd    8 年前

    否,不需要删除成员对象。当父类对象被销毁时,它们将自动被销毁。

    看到这个了吗 FAQ

    对于Qt QObject指针成员,则父对象是所有者,负责删除QObject。看见 here