不是`QPoint`支持`std :: unique_ptr`?

时间:2015-12-01 18:38:01

标签: 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::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 \工具\ mingw492_32 \ i686的-W64-的mingw32 \包括\ C ++ \分机\ new_allocator.h:120:   错误:使用已删除的函数'std :: unique_ptr&lt; _Tp,   _Dp&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,_Dp&gt;&amp;)[with _Tp = QPoint; _Dp = std :: default_delete]'{:: new((void *)__ p)_Up(std :: forward&lt; _Args&gt;(__ args)...); }       ^

这是否意味着我不应该使用unique_ptr来存储QPoint

2 个答案:

答案 0 :(得分:7)

不,问题在于您无法push_back unique_ptr副本

使用push_back(std::move(ptr))emplace构造。

除此之外,我还没有看到需要动态分配价值类,例如QPoint

答案 1 :(得分:3)

在64位平台上,sizeof(QPoint*) == sizeof(QPoint):在QPoint的情况下,指针的大小与指向对象的大小相同。在向量中移动指针并不比在点值周围移动快。通过逐个动态分配这些小东西,你过早地陷入了悲观。

即使在32位系统上,动态分配的开销也会不必要地降低性能。

使用QVector<QPoint>std::vector<QPoint>,他们都可以获得积分。

TL; DR:了解您使用的数据类型,特别是如果它们是QPoint的简单整数元组。