首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT4内存管理

QT4内存管理
EN

Stack Overflow用户
提问于 2010-02-04 22:37:56
回答 3查看 1.6K关注 0票数 5

我有相当强的C语言背景,在C++方面也有相当扎实的基础。最近,我一直在使用C#和其他高级语言。我正在研究的一个项目可以真正从使用QT4中获益,但是我有一些关于内存管理的问题,我似乎无法理解。我已经阅读了QT4文档,但它对我帮助不大。所以这就是我来这里的原因。

1)好的,首先,我知道使用QT4对象的最简单方法是在本地声明它们:

代码语言:javascript
复制
void MyFunc()
{
     QString foo;
     // do stuff to foo

}

这很简单,我可以获取该对象,并传递它,并知道当它超出范围时,它将被销毁。但我有个问题。

1)如果我创建了一个QList并向其中添加了对象,然后该QList超出了作用域,它会尝试释放这些子对象吗?

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

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

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-04 23:17:46

如果我创建了一个QList并向其中添加了对象,然后QList超出了作用域,它是否会尝试解除分配子对象?

QList就像std::list。销毁时会销毁所包含的对象。

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

通常不会,文档应该详细说明会发生什么。一个例外是take*函数(例如: QTableWidget::takeItem)。

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

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

你可以将它添加为窗口小部件的成员(顺便说一句,这里没有QWindow ),它将像任何成员变量一样被销毁。

  • 你可以用QWindow分配它,并将它作为父窗口传递给窗口,由于Qt对象树实现,它将被删除(因为蛋糕widget可以自己做内存管理。

当QWidget (或任何QObject)被销毁时,它会将自己从其父对象的待删除列表中删除,这样您就可以自己删除它,而不必担心双重删除。

票数 13
EN

Stack Overflow用户

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2010-02-04 22:51:50

答案是Qt中存在的父/子对象关系。当父对象超出作用域,或者被任何其他方式销毁时,Qt确保它的所有子对象都被销毁。

有关此行为的更多信息,请单击此处-> http://doc.trolltech.com/4.4/objecttrees.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2200421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档