从这里的这篇文章,一般来说:
所有QObject都将自动删除自己的子对象。(请参见此处为文档。(Q桥是QObject。所以只要你建立父/子关系,您不需要手动删除对象。要做到这一点,只需将指向父对象的指针传递给构造函数:
QLabel *label1 = new QLabel; // <<- NEED TO DELETE QLabel *label2 = new QLabel(some_parent_obj); // Will be deleted when some_parent_obj is deleted
因此出现了一些问题:
- 是否每个小部件都是必需的需要/必需的父级?如果没有,有哪些例外情况?如果是,没有父级的小部件会发生什么
我之所以这么问,是因为从Qt文档中的示例来看,一些示例小部件有父部件(QLabel
示例(,但有些没有(QBarChart
示例,还有QFont
、QColor
等(
所以我想知道是否有一个例外,或这些小部件不需要任何父级,如果出于某种原因我用new
声明它们,那么之后我必须使用delete
。
反之亦然。。。
- 没有父级的小部件是否保证在其所在的小部件(不一定是其父级(被删除时会导致内存泄漏(或类似情况(?或者如果它从布局中删除而没有发生任何删除
因为根据我的代码经验,我可能已经创建了相当多(大约100(个小部件和其他东西,既没有设置任何父级(也没有在之后使用delete
(,而且项目运行得很好,即使过了一段时间也没有任何停顿(虽然效果可能是潜在的,因为我还没有运行Memcheck(,所以这个问题就在这里。
每个必要的小部件都需要/需要一个父级吗?
如果您希望它们自动删除-是的。但是
如果没有,有哪些例外?如果是,没有父窗口小部件会发生什么?
如果使用QLayout::addWidget
将小部件附加到布局,则无需为其提供父级。如果您查看源代码,您会发现当您这样做时,它会自动将布局的父级附加为小部件的父级(除非您没有将布局附加到任何小部件(。
但是,如果您让用new
创建的小部件没有父级,并且不附加到任何东西,这就是内存泄漏。您必须使用delete
或QObject::deleteLater
删除它。当对象有任何连接时,建议使用最后一个选项。
没有父级的小部件是否保证在删除其所在的小部件(不一定是其父级(时会导致内存泄漏(或类似情况(?或者如果它从布局中删除而没有发生任何删除?
正如我已经提到的,QLayout::addWidget
为添加的小部件设置了父级,所以答案是否定的。另外请注意,当您调用QLayout::removeWidget
时,它只从布局中删除QLayoutItem
,但小部件的父级在调用QLayout::addWidget
后保持不变。