带有对象的 Qt 容器

标签 qt containers copy-constructor push-back

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

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

我可以一些官方文档,所以我在这里问...

谢谢

最佳答案

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

The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator. This covers most data types you are likely to want to store in a container, including basic types such as int and double, pointer types, and Qt data types such as QString, QDate, and QTime, but it doesn't cover QObject or any QObject subclass (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a QList, the compiler will complain that QWidget's copy constructor and assignment operators are disabled.

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

“Placement new”是一项 C++ 功能,可用于指定对象在内存中构造的位置,但它的管理复杂且存在一些限制。放置新的和内存池的优点很少超过复杂性的增加和灵活性的损失。

关于带有对象的 Qt 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28727418/

相关文章:

c++ - 将变量从 C++ 公开到 qml

python - QtGui.QSystemTrayIcon settooltip 在 debian stretch 中不起作用

c++ - 不同类型数据的注册

具有不可复制不可移动元素类型的 C++ 容器

docker - Helm和Docker-Compose共享同一个环境文件的方法

c++ - 调用 placement new 时,将指针强制转换为 "void*"有什么影响吗?

c++ - QML 无法将 Shared_ptr<Track> 分配给 [未知属性类型]

c++ - 在 Qt 5.2 中替代 QHttp

c++ - 没有按预期调用复制构造函数

c++ - 如何将基类的私有(private)成员复制到派生类的复制构造函数中