QT4内存管理

5
我具备相当扎实的 C 背景和较为坚实的 C++ 基础。最近我一直在使用 C# 和其他高级语言。我正在考虑使用 QT4 开发一个项目,但是我有一些关于内存管理的问题无法理解。我已经阅读了 QT4 文档,但并没有帮助我太多。所以我来这里求助。
首先,我知道使用 QT4 对象的最简单方法是将它们声明为局部变量。
void MyFunc()
{
     QString foo;
     // do stuff to foo

}

这很简单,我可以接受该对象并传递它,并知道当它超出范围时它将被销毁。但是我的问题在于:
1)如果我创建一个QList并添加对象到其中,然后QList超出范围,它会尝试释放子对象吗?
2)如果QT4例程返回指向对象的指针,那么我是否需要负责释放该对象?
3)如果我创建一个QWidget的子类,并将其添加到QWindow中,如何确保当QWindow被销毁时,它带走了我的小部件?
感谢您的帮助。

你的一些答案在“对象所有权文档”中:http://cep.xor.aps.anl.gov/software/qt4-x11-4.2.2/objecttrees.html。 - Marcin Gil
3个回答

13

如果我创建一个QList并向其中添加对象,然后QList超出范围,它会尝试释放子对象吗?

QList就像std :: list一样。当它被销毁时,它将销毁包含的对象。

如果Qt4例程返回一个对象指针,那么我是否有责任释放该对象?

通常情况下不需要,文档应该说明发生了什么。例外是take*函数(例如:QTableWidget :: takeItem)。

如果我创建QWidget的子类并将其添加到QWindow中,如何确保在销毁QWindow时,它会将我的小部件带走?

这取决于您如何创建子类对象。

  • 您可以将其添加为窗口小部件的成员,它将像任何成员变量一样被销毁。
  • 您可以使用new进行分配,并将其父窗口传递给它,由于Qt对象树实现的存在,它将被删除(如cake所提到的)。
  • 您可以自己进行内存管理。

当QWidget(或任何QObject)被销毁时,它将从其父项的待删除列表中删除自身,因此您可以自行删除它,而不必担心双重删除问题。


2

你可能想从这里开始:对象树,因为它解释了Qt使用的父/子关系(到目前为止给出的所有其他链接都已过时或来自第三方)。

1)如果我创建一个QList并向其中添加对象,然后QList超出范围,它会尝试释放子对象吗?

是的,它的行为类似于std::list。就像std::list一样,它只会释放而不会删除。这就是一些Qt指针类很有用的地方。

2)如果QT4例程返回指向对象的指针,那么我是否负责释放该对象?

通常不需要,但如果需要,文档会说明。

3)如果我创建QWidget的子类并将其添加到QWindow中,如何确保当销毁QWindow时,它会连带销毁我的小部件?

创建子类时,请务必在构造函数中使用parent参数。这样,对象将由Qt删除。如果需要,可以在之后使用QObject::setParent ( QObject * parent )设置父类。


1
答案是在Qt中存在的父/子对象关系。当父对象超出范围或以任何其他方式被销毁时,Qt确保所有其子对象都被销毁。
有关此行为的更多信息可以在此处找到-> http://doc.trolltech.com/4.4/objecttrees.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接