【发布时间】:2019-06-10 17:12:49
【问题描述】:
我创建了一个标准向量,并使用标准移动将一堆对象推回它上面,例如:
vector<unique_ptr<Foo> > myVec;
unique_ptr<Foo> a = make_unique<Foo>();
unique_ptr<Foo> b = make_unique<Foo>();
myVec.push_back(move(a));
myVec.push_back(move(b));
到目前为止,一切都很好。
稍后,我将 myVec 的引用传递给一个函数,并尝试使用 [] 运算符访问向量中的数据。
void someFunc(vector<unique_ptr<Foo> > &myVec)
{
Foo* anObj = myVec[0];
}
经过一番阅读,我的猜测是这种方法行不通,因为 std 向量将尝试制作副本,除非我在 Foo 上提供一个 copyconstructor 以避免实际制作副本,否则它将永远无法工作。我对么? 我想我看过一些关于使用迭代器的帖子,但如果我不必这样做,我宁愿不这样做。
编辑1:
我确实设法通过以下方式解决它(使用迭代器,然后获取原始指针)
void someFunc(vector<unique_ptr<Foo> > &myVec)
{
int offset = 0; // Or some other offset into the vector
auto it = myVec.begin() + offset;
Foo* anObj = it.get();
// ... Do something using anObj here...
}
我认为这是要走的路,只要您不愚蠢地尝试保留 anObj 然后在某处手动释放它。我当然可以暂时转让所有权,直到我完成它然后归还所有权,但这感觉很麻烦。对上述方法有什么想法吗?
提前致谢, /吉米
【问题讨论】:
-
如果您查看
std::unique_ptr的文档,您会看到是否有几种方法可以返回指针:即release()和get()- 阅读它们并决定您想要哪个做,或者直接使用来自myVec[0]的指针,而不是在任何地方复制它。 -
刚刚发布了一个更新编辑,我使用 get() 方式。我是否正确理解它,这是一种好的方法吗?我猜它“主要”是为了让 unique_ptr 与你必须做的遗留代码一起工作。我的代码是新的,所以我不想在其中有一个丑陋的模式。据我了解,我在 EDIT 部分下的解决方案是正确的。如果不是,我会很乐意学习和纠正它
-
前提好像是
myVec[0]做了个拷贝。它没有。 -
@LightnessRacesinOrbit:你是对的。我一定犯了其他错误,我再次更新了代码,它似乎工作得很好。 Foo* anObj = myVec[0].get() 工作正常。
标签: c++ vector unique-ptr