带有对象的Qt容器

带有对象的Qt容器,qt,containers,copy-constructor,push-back,Qt,Containers,Copy Constructor,Push Back,当使用Qt容器作为Qlist、Qvector等来保存某个类(比如一个包含许多数据成员和逻辑的复杂类)并调用insert/append/push_back时,添加到容器中的对象是插入到容器中还是复制到容器中(cctor) 假设它被复制了,那么如果我动态分配它并传递一个指针,那么只有指针会被复制?如果我传递对象本身,那么我需要释放之前分配的内存,因为对象被复制了 我可以提供一些官方文件,所以我在这里问 感谢对于QObject派生对象,您必须使用动态分配,只需在容器中放置指针,因为此类对象具有唯一标识

当使用Qt容器作为Qlist、Qvector等来保存某个类(比如一个包含许多数据成员和逻辑的复杂类)并调用insert/append/push_back时,添加到容器中的对象是插入到容器中还是复制到容器中(cctor)

假设它被复制了,那么如果我动态分配它并传递一个指针,那么只有指针会被复制?如果我传递对象本身,那么我需要释放之前分配的内存,因为对象被复制了

我可以提供一些官方文件,所以我在这里问


感谢

对于
QObject
派生对象,您必须使用动态分配,只需在容器中放置指针,因为此类对象具有唯一标识,因此禁止复制。在这种情况下,只复制指针,它只是一个整数,对指针指向的实际对象没有影响。对于动态分配的对象,您必须手动管理生命周期,或者使用Qt的父/子功能让对象由其父对象“收集”

存储在各种容器中的值可以是任何可分配的数据类型。要进行限定,类型必须提供默认构造函数 复制构造函数和赋值运算符。这涵盖了大多数数据 您可能希望存储在容器中的类型,包括基本类型 类型(如int和double)、指针类型和Qt数据类型(如 QString、QDate和QTime,但它不包括QObject或任何QObject 子类(QWidget、QDialog、QTimer等)。如果你试图 实例化一个QList,编译器会抱怨 QWidget的复制构造函数和赋值运算符被禁用

正如上面引用的文本所示,当将实际实例放置在容器中时,将发生对象的复制。在这种情况下,您不必手动删除任何内容,因为副本的源通常是一个本地对象,并且通常是一个临时对象,编译器将负责删除


“放置new”是一个C++特性,可以用来指定对象在内存中的位置,但它的复杂性在于它的管理和一些限制。放置新池和内存池的好处很少超过复杂性的增加和灵活性的丧失。

如果容器的模板类型是指针,则不会复制对象。否则,将制作一份副本。QObject子对象已禁用复制子对象,因此无法将其放置到容器中。我建议您阅读官方文档和一些关于编程的书籍(如stl和RAII等容器)。