我想将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
?
答案 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
的简单整数元组。