QWidget删除问题

QWidget删除问题

问题描述:

我有一个标准的QWidget派生类,但是在小部件销毁后我得到了两倍的空闲。每当我添加一个QTreeView指针作为成员变量。QWidget删除问题

例如为:

private: 
    QTreeView *m_treeView; 

在类的构造函数,我做一个简单:

m_treeView = new QTreeView(this); 

而QWidget的派生类的析构函数是默认的析构函数。

如果我放弃使用完全成员指针和做:

QTreeView *treeView = new QTreeView(this); 

一切都很好。有QLabel成员指针也工作正常。为什么我看到这种行为?指针是否是类的成员应该与类的析构函数没有关系,因为对象是在堆上创建的,并且类不会删除它们的成员变量所指向的对象,除非指示在自定义析构函数。

+0

事实证明,这是一个相当平凡的问题。我已经将这个类移动到第二个目录,但由于某种原因,qmake没有将使用QWidget派生类的MainWindow类标记为需要重建。 将指针添加为成员变量会改变类的大小,这会在删除时导致内存损坏问题。由于我没有改变类的构造函数的ABI,所以应用程序目标仍然被链接,但是QWidget派生类的大小变化是导致我所有问题的原因。 –

每当你的QWidget的派生的对象被删除,m_treeView也将因为你通过this作为父对象,当你构建m_treeView

这是因为new QTreeView(this)最终将调用QObject(QObject * parent),这意味着你的成员变量被添加为已删除您的QWidget派生对象的子对象。

父对象的析构函数销毁所有子对象。

the Qt docs

编辑: 对不起,错过了

而QWidget的派生类的析构函数是默认的析构函数。

部分

+0

是的,但这并不能解释_double_免费。非成员变量版本也包含“this”,所以人们会期待相同的行为。但它最终成为腐败,而不是双重*。事实证明,由于文件移动导致内存损坏,qmake没有检测到它。我发布了更多的细节,作为对我原来的问题的评论。 –

+0

@Jonathan我以为你可能自己删掉了指针,但是我重读了你的问题,并意识到你没有 – dirk