繁体   English   中英

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

[英]Memory management for collections of widgets in Qt

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM