如果一个 QObject 是一个类的成员(不是用 new-operator 创建的)并且同时是类实例的 child ,它应该被删除两次,因为类实例的所有 child 都被删除并在类的析构函数中删除所有类成员。因此,程序应该崩溃。但这并没有发生,所以 Qt 必须以某种方式检测到这种双重关系。但这真的会发生吗?如果是,它是如何工作的?
这是一个例子:
class MyWindow : public QMainWindow {
Q_OBJECT
public:
MyWindow();
QLabel label;
};
MyWindow::MyWindow() : label(this) {}
当 MyWindow
的实例被销毁时,label
应该被删除两次,因为它是 MyWindow
的成员和子级。但这并没有发生,这样做似乎是安全的。但它是如何工作的?
最佳答案
这在这种情况下有效,因为删除顺序:
- ~MyWindow() 首先被调用,它破坏了标签。标签的 ~QObject() 析构函数从父级的子级列表中删除对象。
- 在 ~MyWindow() 之后,在某个时候调用 MyWindow 的 ~QObject() 析构函数,删除窗口的子项。但是,由于标签指针已从子列表中删除,因此不会尝试再次删除标签。
关于qt - 如果 QObjects 同时是类(class)成员和 child ,为什么不删除两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21561439/