带有对象的Qt容器

时间:2015-02-25 19:00:32

标签: qt containers copy-constructor push-back

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

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

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

由于

1 个答案:

答案 0 :(得分:3)

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

  

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

如上面引用的文字所示,当将实际实例放入容器时,将发生对象的复制。在这种情况下,您不必手动删除任何内容,因为副本的源通常是本地对象,通常是临时对象,编译器将对此进行处理。

"安置新"是一个C ++特性,您可以使用它来指定对象在内存中的构造位置,但它具有管理它的复杂性和一些限制。放置新内存池和内存池的优势很少超过复杂性的增加和灵活性的损失。