Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。

去年关闭。



Improve this question




让代码自行解释:
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是否会使我的 vector 不一致,或者两种方法都可以。
由于架构缺陷,我真的应该像getAt1一样返回。

你怎么看?

谢谢。

最佳答案

这个:

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

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

如果要授予对实例的访问权以供短期使用,只需返回对托管对象的引用:
MyType& SomeClass::getAt1(int i)
{
    return *cache[i];
}

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

当然,这假设unique_ptr绝不是nullptr。尚不清楚是否在nullptr中允许cache值。如果是,则不返回引用。按照getAt2()示例,返回一个原始指针。同样的注意事项仍然适用。如果unique_ptr更改,返回的指针将变为无效。

最后,所有这些都假定SomeClassMyTypecache对象的所有者,并且get()函数仅授予对这些对象的临时非所有权访问。如果不是,那么您应该改用shared_ptr并返回shared_ptr:
std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
    return cache[i];
}

10-07 19:09
查看更多