如何从向量正确返回唯一的_ptr



让代码本身解释:

class SomeClass {
private:
  std::vector<std::unique_ptr<MyType>> cache;
public:
  std::unique_ptr<MyType> getAt1(int i);
  MyType* getAt2(int i);
}
std::unique_ptr<MyType> SomeClass::getAt1(int i) {
  return std::move(cache[i]);
}
MyType* SomeClass::getAt2(int i) {
  return cache[i].get();
}

我想知道getAt1是否会使我的向量不一致,或者两种方式还可以。由于架构缺陷,我真的应该像GetAt1一样返回。

您的意见是什么?

谢谢。

this:

return std::move(cache[i]);

修改向量内的智能指针。它不再管理MyType指针。get()之后将返回nullptr。我不认为这就是你想要的。

如果您想授予对实例的短期使用访问权限,只需返回对托管对象的引用:

MyType& SomeClass::getAt1(int i)
{
    return *cache[i];
}

通常的警告在这里适用。如果更改了cache中的unique_ptr(被销毁,重新分配,重置等(,则参考可能会变得无效。返回的参考仅用于短期使用。

这当然假设unique_ptr从来都不是nullptr。目前尚不清楚您是否允许nullptr中的CC_8值。如果是,则不要返回参考。根据您的getAt2()示例,返回原始指针。同样的警告仍然适用。如果unique_ptr更改,返回的指针将无效。

最后,所有这些都假定SomeClasscacheMyType对象的所有者,并且get()功能仅授予临时的,非持有的访问权限。如果没有,则应切换到shared_ptr,也应该返回shared_ptr

std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
    return cache[i];
}

您可能已经知道,您可以使用shared_ptr而不是unique_ptr。

getAt1的问题是向量中的元素然后是空的。我认为您想做getAt2,而是。

相关内容

  • 没有找到相关文章

最新更新