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

J C*_*per 5 c++ qt memory-management

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

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

作为一个附带问题,是什么让它成为我所以不必担心析构函数?

Bar*_*ark 7

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

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

  • 您不能将Qt集合设置为对象的父级.动态分配并具有父子关系的对象是QObject,它们将QObjects/QWidgets子类作为父对象.QList和其他集合类不从QWidget(和扩展名QObject)继承,因此您不能将其设置为父级. (2认同)

Tre*_*out 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*>它们的集合,并且你没有给它们父母,那么你应该自己删除它们.