【问题标题】:QT4 Memory ManagementQT4 内存管理
【发布时间】:2010-02-05 00:46:50
【问题描述】:

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

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

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

}

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

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

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

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

感谢您的帮助。

【问题讨论】:

标签: c++ qt memory-management qt4


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    正如rpg所说,通常不会,但如果你是文档会这样说的。

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

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

    【讨论】:

      【解决方案3】:

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

      可以在此处找到有关此行为的更多信息 -> http://doc.trolltech.com/4.4/objecttrees.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-21
        • 2012-03-21
        • 1970-01-01
        • 2016-10-12
        • 2012-06-14
        相关资源
        最近更新 更多