Qt “QPoint”不支持“std::unique\u ptr”吗?
我想将QPoint存储在一个对象中,该对象应该自动释放Qt “QPoint”不支持“std::unique\u ptr”吗?,qt,c++11,Qt,C++11,我想将QPoint存储在一个对象中,该对象应该自动释放 #include <QCoreApplication> #include <memory> #include <QPoint> using namespace std; class MyWidget{ public: vector<std::unique_ptr<QPoint>> _points; void f(QPoint point){ std
#include <QCoreApplication>
#include <memory>
#include <QPoint>
using namespace std;
class MyWidget{
public:
vector<std::unique_ptr<QPoint>> _points;
void f(QPoint point){
std::unique_ptr<QPoint> pos(new QPoint(point));
_points.push_back(pos);
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyWidget wid;
wid.f(QPoint(0,0));
return a.exec();
}
错误消息是:
F:\Qt\Qt5.5.0\Tools\mingw492\u 32\i686-w64-mingw32\include\c++\ext\new\u分配器。h:120:
错误:使用已删除的函数“std::unique\u ptr::unique\u ptrconst std::unique\u ptr&[with{u Tp=QPoint;\u Dp=std::default\u delete]”{::newvoid*u p\u Upstd::forward\u args…}
^
这是否意味着我不应该使用unique\u ptr来存储QPoint?不,问题是您不能将unique\u ptr的副本推回 使用push_backsd::moveptr或安放构造 除此之外,我不认为需要动态分配QPoint之类的值类。在64位平台上,sizeofQPoint*==sizeofQPoint:指针的大小与QPoint中指向的对象的大小相同。在向量中围绕指针移动并不比围绕点值移动快。动态地一件一件地分配这些小事情会让你过早地悲观 即使在32位系统上,动态分配的开销也会对性能造成不必要的影响 使用QVector或std::vector,它们都能很好地处理点
TL;DR:了解您使用的数据类型,特别是当它们是像QPoint一样的简单整数元组时。QPoint是一个很小的对象,使用任何指针和堆分配都是毫无意义的。您需要_points。push_backsd::make_uniquepoint;。顺便说一句,在向量中存储无法正确复制的内容通常是不好的做法。关于它的答案是正确的,只是想补充说,重新设计可能也需要。我需要一个向量,它不会删除任何元素。似乎在向量中存储普通的“QPoint”并使用常量引用来评估它更好,对吗@马斯塔莱里肯定会说“是的”。QPoint没有那么重,除非您有数千个,但容器并不是您唯一的问题。实际上,boost::ptr_向量正确地传播了constness,但这将是一个可怕的过度杀伤力。所以,是的,常数参考,imho@不要使用QList,在32位系统上,这将是一场灾难@佩佩:没错。根本没有理由使用它,真的,所以我把它删除了。谢谢你指出这一点。