带有对象的 Qt 容器
Qt containers with object
当使用 Qt 容器作为 Qlist、Qvector 等来容纳一些 class(比如一个具有许多数据成员和逻辑的复杂 class)并调用 insert/append/push_back 时,对象将被添加到容器插入到容器或将被复制(cctor)?
假设它被复制了那么如果我动态分配它并传递一个指针那么只会复制指针?如果我传递对象本身,那么我需要释放之前分配的内存,因为对象已被复制?
我可以得到一些官方文档,所以我在这里问...
谢谢
对于 QObject
个派生对象,您必须使用动态分配并仅将指针放入容器中,因为此类对象具有唯一标识,因此禁止复制。在那种情况下,只有指针被复制,它只是一个整数,其复制对它指向的实际对象没有影响。对于动态分配的对象,您必须手动管理生命周期或使用 Qt 的 parent/child 功能通过其父对象拥有对象 "collected"。
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++ 功能,您可以使用它来指定对象在内存中的构造位置,但它带来了管理它的复杂性和一些限制。 placement new 和 memory pools 的优势很少超过复杂性的增加和灵活性的损失。
当使用 Qt 容器作为 Qlist、Qvector 等来容纳一些 class(比如一个具有许多数据成员和逻辑的复杂 class)并调用 insert/append/push_back 时,对象将被添加到容器插入到容器或将被复制(cctor)?
假设它被复制了那么如果我动态分配它并传递一个指针那么只会复制指针?如果我传递对象本身,那么我需要释放之前分配的内存,因为对象已被复制?
我可以得到一些官方文档,所以我在这里问...
谢谢
对于 QObject
个派生对象,您必须使用动态分配并仅将指针放入容器中,因为此类对象具有唯一标识,因此禁止复制。在那种情况下,只有指针被复制,它只是一个整数,其复制对它指向的实际对象没有影响。对于动态分配的对象,您必须手动管理生命周期或使用 Qt 的 parent/child 功能通过其父对象拥有对象 "collected"。
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++ 功能,您可以使用它来指定对象在内存中的构造位置,但它带来了管理它的复杂性和一些限制。 placement new 和 memory pools 的优势很少超过复杂性的增加和灵活性的损失。