代码之家  ›  专栏  ›  技术社区  ›  Timothy Baldridge

qt4内存管理

  •  5
  • Timothy Baldridge  · 技术社区  · 14 年前

    我来自一个相当强大的C背景,并且有一个相当坚实的C++基础。最近,我一直在使用C语言和其他更高级的语言。我正在研究的一个项目确实可以从使用qt4中受益,但是我对内存管理有一些问题,我似乎不太明白。我已经阅读了qt4文档,它对我没有太大帮助。所以我才来这里。

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

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

    这就足够简单了,我可以拿着那个对象,把它传过来,知道当它超出范围的时候,它就会被销毁。但这是我的问题。

    1)如果我创建一个qlist并向其添加对象,然后qlist超出范围,它会尝试取消分配子对象吗?

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

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

    谢谢你的帮助。

    3 回复  |  直到 14 年前
        1
  •  13
  •   rpg    14 年前

    如果我创建一个qlist并向其添加对象,然后qlist超出范围,它会尝试取消分配子对象吗?

    qlist就像std::list。它将在被销毁时销毁所包含的对象。

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

    通常不会,文档应该指定发生了什么。Take*函数是一个例外(例如:qTableWidget::TakeItem)。

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

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

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

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

        2
  •  2
  •   Adam W    14 年前

    您可以从这里开始: Object Trees 这就解释了qt使用的父/子关系(到目前为止提供的所有其他链接都已过期或是第三方)。

    1)如果我创建一个qlist并向其添加对象,然后qlist超出范围,它会尝试取消分配子对象吗?

    是的,它的行为就像std::list。就像std::list一样,它只会取消分配而不是删除。这里有一些 Qt pointer classes 手巧

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

    正如RPG所说,通常不会,但是如果您是文档,文档会这样说。

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

    创建子类时,请确保在ctor中使用父参数。这样,qt将删除对象。如果需要,可以在 QObject::setParent ( QObject * parent ) .

        3
  •  1
  •   cake    14 年前

    答案是qt中存在的父/子对象关系。当父对象超出范围或被任何其他方法破坏时,qt确保它的所有子对象都被破坏。

    有关此行为的详细信息,请参阅此处-> http://doc.trolltech.com/4.4/objecttrees.html