代码之家  ›  专栏  ›  技术社区  ›  ClimbingLung

带对象的Qt容器

  •  2
  • ClimbingLung  · 技术社区  · 9 年前

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

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

    我可以得到一些官方文件,所以我问这里。。。

    谢谢

    1 回复  |  直到 9 年前
        1
  •  3
  •   dtech    9 年前

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

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

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

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

    推荐文章