2010-03-03 30 views
5

对于愚蠢的问题抱歉,但我第一次使用Qt和C++,并且通过本教程和一些示例进行了工作。Qt中的小部件集合的内存管理

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

作为一个侧面的问题,是怎么回事,所以我不必担心析构函数?

回答

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*>集合,并且您没有给他们父母,那么您应该自己删除它们。

7

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

Qt模型在UI层次结构中非常有意义,它与UI层次结构一一对应。在其他情况下,它并不总是清晰地映射,你需要评估使用Qt系统是否对特定情况有意义。正常的C++工具仍然有效:您可以使用std :: tr1 :: shared_ptr或其他任何智能指针类来帮助您管理对象生存期。 Qt还包括QPointer(一个保护指针)和QSharedPointer/QWeakPointer对,它们实现了引用智能指针和弱引用对。

+2

您不能将Qt集合设置为对象的父对象。动态分配并具有父子关系的对象是QObjects,它们以QObjects/QWidgets子类作为父项。 QList和其他集合类不会从QWidget(以及扩展QObject)继承,因此您无法将其设置为父级。 – blwy10 2010-03-04 00:32:35