C++ QWidget删除问题

C++ QWidget删除问题,c++,qt,C++,Qt,我有一个标准的QWidget派生类,但我在小部件销毁时获得了双重释放。每当我将QTreeView指针添加为成员变量时 例如: 在类的构造函数中,我执行一个简单的操作: m_treeView = new QTreeView(this); QWidget派生类的析构函数是默认析构函数 如果我完全放弃使用成员指针,并执行以下操作: QTreeView *treeView = new QTreeView(this); 一切都很好。拥有QLabel成员指针也很好。为什么我会看到这种行为?指针是否是类的

我有一个标准的QWidget派生类,但我在小部件销毁时获得了双重释放。每当我将QTreeView指针添加为成员变量时

例如:

在类的构造函数中,我执行一个简单的操作:

m_treeView = new QTreeView(this);
QWidget派生类的析构函数是默认析构函数

如果我完全放弃使用成员指针,并执行以下操作:

QTreeView *treeView = new QTreeView(this);

一切都很好。拥有QLabel成员指针也很好。为什么我会看到这种行为?指针是否是类的成员应该与类的析构函数无关,因为对象是在堆上创建的,并且类不会删除其成员变量指向的对象,除非在自定义析构函数中指示这样做。

每当删除QWidget派生的对象时,m_treeView也将被删除,因为您在构建m_treeView时将其作为父对象传递

这是因为新的QTreeViewthis最终将调用QObject QObject*parent,这意味着您的成员变量将作为QWidget派生对象的子对象添加

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

编辑: 对不起,没赶上火车

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


部分这是一个相当平常的问题。我已将该类移动到第二个目录,但出于某种原因,qmake没有将使用QWidget派生类的MainWindow类标记为需要重建。将指针作为成员变量添加会更改类的大小,从而在删除时导致内存损坏问题。应用程序目标仍然链接,因为我没有更改类构造函数的ABI,但QWidget派生类大小的更改是导致我所有问题的原因。是的,但这不能解释双自由。非成员变量版本也为其设置了父级,因此人们会期望出现相同的行为。但最终它是一种腐败,而不是双重自由。由于文件移动而qmake没有检测到,结果是内存损坏。我贴了更多的细节作为对我原来问题的评论。@Jonathan我想也许是你自己删除了指针,但后来我重新阅读了你的问题,意识到你没有
QTreeView *treeView = new QTreeView(this);