[英]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被销毁时,它需要我的小部件呢?
这取决于您如何创建子类对象。
当一个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.