Qt中小部件集合的内存管理

时间:2010-03-03 18:52:58

标签: c++ qt memory-management

对于这个愚蠢的问题感到抱歉,但我是第一次使用Qt和C ++,并完成了教程和一些示例。

提到的一件事是Qt的东西不需要被明确删除。那么,主要问题,这是否也适用于Qt的集合?就像说我想要动态数量MyWidget s,所以我保留vector或其中任何一个。他们还在为我照顾吗?

作为一个附带问题,是什么让它变得如此我不必担心析构函数?

2 个答案:

答案 0 :(得分:7)

Qt内存管理模型基于父子关系。 Qt类使用可选的parent作为其构造函数的参数。新实例向此父项注册,以便在删除父项时删除它。如果您正在使用Qt集合(例如QList),我相信您可以将列表设置为其条目的父级。如果您使用的是std :: vector或其他集合类型,则无法进行“自动”内存管理。

Qt模型在UI层次结构中非常有意义,它与UI层次结构一对一匹配。在其他情况下,它并不总是以干净的方式映射,您需要评估使用Qt系统是否对特定情况有意义。普通的C ++工具仍然有效:您可以使用std :: tr1 :: shared_ptr或任何其他智能指针类来帮助您管理对象的生命周期。 Qt还包括QPointer,一个有保护的指针,以及实现引用couting智能指针和弱引用对的QSharedPointer / QWeakPointer对。

答案 1 :(得分:5)

Qt确实有一个有趣的对象模型。当我第一次开始时,让我感到不安的是,有new Foo次呼叫而没有delete次呼叫。

http://qt.nokia.com/doc/4.6/object.html是开始阅读对象模型的好地方。

感兴趣的事情: QObject子类的赋值和copy-ctor方法被禁用。对象子父项链由QObject内部维护。

通常在实例化QObject子类时(如果您不打算自己管理它的指针),您将提供另一个QObject指针作为父类。然后,这个“父母”接管您刚才所生的孩子的管理。您可以在QObject上调用setParent()来更改“拥有”它的人。 Qt中很少有方法可以更改对象的父级,并且它们都明确声明它们在文档中完成。

所以回答你的具体问题:这取决于你如何制作所有的MyWidget实例。

如果你用父母制作每一个,那么你不必删除它们。父母将在删除它们时删除它们。

如果你保留了QList<MyWidget*>这些的集合,并且你没有给他们父母,那么你应该自己删除它们。