Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt “QPoint”不支持“std::unique\u ptr”吗?_Qt_C++11 - Fatal编程技术网

Qt “QPoint”不支持“std::unique\u ptr”吗?

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

我想将QPoint存储在一个对象中,该对象应该自动释放

#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位系统上,这将是一场灾难@佩佩:没错。根本没有理由使用它,真的,所以我把它删除了。谢谢你指出这一点。