我有相当强的C语言背景,在C++方面也有相当扎实的基础。最近,我一直在使用C#和其他高级语言。我正在研究的一个项目可以真正从使用QT4中获益,但是我有一些关于内存管理的问题,我似乎无法理解。我已经阅读了QT4文档,但它对我帮助不大。所以这就是我来这里的原因。
1)好的,首先,我知道使用QT4对象的最简单方法是在本地声明它们:
void MyFunc()
{
QString foo;
// do stuff to foo
}这很简单,我可以获取该对象,并传递它,并知道当它超出范围时,它将被销毁。但我有个问题。
1)如果我创建了一个QList并向其中添加了对象,然后该QList超出了作用域,它会尝试释放这些子对象吗?
2)如果QT4例程返回一个指向对象的指针,那么我是否负责释放该对象?
3)如果我创建了一个QWidget的子类,并将其添加到一个QWindow中,我如何确保当QWindow被销毁时,它会带走我的小部件?
谢谢你的帮助。
发布于 2010-02-04 23:17:46
如果我创建了一个QList并向其中添加了对象,然后QList超出了作用域,它是否会尝试解除分配子对象?
QList就像std::list。销毁时会销毁所包含的对象。
如果Qt4例程返回一个指向对象的指针,那么我是否负责释放该对象?
通常不会,文档应该详细说明会发生什么。一个例外是take*函数(例如: QTableWidget::takeItem)。
如果我创建QWidget的子类,并将其添加到QWindow中,我如何确保当QWindow被销毁时,它会带走我的小部件?
这取决于您如何创建子类对象。
你可以将它添加为窗口小部件的成员(顺便说一句,这里没有QWindow ),它将像任何成员变量一样被销毁。
当QWidget (或任何QObject)被销毁时,它会将自己从其父对象的待删除列表中删除,这样您就可以自己删除它,而不必担心双重删除。
发布于 2010-02-05 00:46:51
你可能想从这里开始:Object Trees,因为这解释了Qt使用的父/子关系(到目前为止给出的所有其他链接都是过期的或第三方的)。
1)如果我创建了一个QList并向其中添加了对象,然后QList超出了作用域,它会尝试释放子对象吗?
是的,它的行为就像std::list。就像std::list一样,它只会释放而不会删除。这就是一些Qt pointer classes派上用场的地方
2)如果QT4例程返回一个指向对象的指针,那么我是否负责释放该对象?
正如rpg所说,通常不会,但如果你是,文档会这样说。
3)如果我创建了一个QWidget的子类,并将其添加到一个QWindow中,我如何确保当QWindow被销毁时,它会带走我的小部件?
在创建子类时,请确保使用ctor中的parent参数。这样,对象将被Qt删除。如果需要,可以使用QObject::setParent ( QObject * parent )设置父对象after。
发布于 2010-02-04 22:51:50
答案是Qt中存在的父/子对象关系。当父对象超出作用域,或者被任何其他方式销毁时,Qt确保它的所有子对象都被销毁。
有关此行为的更多信息,请单击此处-> http://doc.trolltech.com/4.4/objecttrees.html
https://stackoverflow.com/questions/2200421
复制相似问题