繁体   English   中英

QT4内存管理

[英]QT4 Memory Management

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

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

void MyFunc()
{
     QString foo;
     // do stuff to foo

}

这很简单,我可以拿走那个对象,并传递它,并知道当它超出范围时它将被销毁。 但这是我的问题。

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

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

3)如果我创建QWidget的子类,并将其添加到QWindow,我如何确保在QWindow被销毁时,它需要我的小部件?

谢谢您的帮助。

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

QList就像std :: list一样。 它会在被破坏时销毁所包含的对象。

如果Qt4​​例程返回指向对象的指针,那么我是否负责该对象的取消分配?

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

如果我创建一个QWidget的子类,并将其添加到QWindow,我如何确保在QWindow被销毁时,它需要我的小部件呢?

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

  • 您可以将其添加为窗口小部件的成员(顺便说一下,没有QWindow),它将像任何成员变量一样被销毁。
  • 您可以使用new分配它,并将窗口作为父窗口传递给它,由于Qt对象树的实现,它将被删除(如提到的蛋糕)
  • 你可以自己做内存管理。

当一个QWidget(或任何QObject)被销毁时,它会从其父级的删除列表中删除它,这样你就可以自己删除它而不用担心双重删除。

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

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

是的,它的行为就像std :: list一样。 就像std :: list一样,它只会释放不删除。 这是一些Qt指针类派上用场的地方

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

正如RPG所说,通常不会,但如果你是文件就会这么说。

3)如果我创建QWidget的子类,并将其添加到QWindow,我如何确保在QWindow被销毁时,它需要我的小部件?

创建子类时,请确保在ctor中使用parent参数。 这样,Qt就会删除该对象。 如果需要,可以使用QObject :: setParent(QObject * parent)设置父项

答案是Qt中存在的父/子对象关系。 当父对象超出范围,或被任何其他方式销毁时,Qt确保将其所有子对象销毁。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM