在查看Qt示例时(在movieplayer example或here等Qt文档上),我从未看到成员析构函数被明确调用。
类定义如下:
class foo : public QParent {
Q_OBJECT
QStuff stuff;
foo (QWidget *parent) : QParent(parent)
{
stuff = new QStuff(this);
}
};
我的问题是我从未见过像delete stuff;
所以我的问题是:
QObject
派生的类实例{父母是<{p>
parent
NULL
删除QObject
派生成员而不将其设置为NULL
是否有危险?
我猜答案是肯定和否定,但我不确定。
答案 0 :(得分:4)
对于第一个问题是。您可以查看Qt文档here 明确说明:
QObjects在对象树中组织自己。当你创建一个 QObject以另一个对象作为父对象,该对象将自动生成 将自己添加到父亲的子()列表中。父母拥有所有权 对象;即,它将自动删除其中的子女 析构函数。您可以按名称查找对象,也可以选择键入 使用findChild()或findChildren()。
对于第二个问题,答案值得更多解释。如果QObject指针成员不是对象的子成员,则必须在类的析构函数中手动处理它们。
理论上,您可以在任何QObject *上使用delete
来调用其析构函数,但由于Qt对象具有基于信号/槽的强大事件系统,因此您必须了解与事件循环的交互。如果您残酷地删除连接到另一个QObject的QObject,而后者仍在处理来自第一个QObject的信号,则可能会遇到一些问题。
这适用于单线程和多线程应用程序。因此,您应该避免使用delete
支持QObject::deleteLater(),这将推迟删除QObject,直到处理完所有与之相关的信号/槽。
最后,在实现析构函数的上下文中,如果将指针设置为null并不重要,因为它无论如何都无法继续使用。如果在实例仍处于活动状态时删除其他方法中的指针对象,并将指针设置为null以将其标记为未初始化,则可能很重要。
答案 1 :(得分:1)