如何从向量正确返回unique_ptr?

时间:2019-07-02 23:54:02

标签: c++ c++11 smart-pointers unique-ptr

让代码自行解释:

public function udate()
{
    $now = new DateTime();
    $microseconds = $now->format('u');
    list($milliPart, $microPart) = str_split($microseconds, 3);
    return $now->format('H:i:s') . ".$milliPart.$microPart";
}
class SomeClass {
private:
  std::vector<std::unique_ptr<MyType>> cache;
public:
  std::unique_ptr<MyType> getAt1(int i);
  MyType* getAt2(int i);
}

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

您对此有何看法?

谢谢。

3 个答案:

答案 0 :(得分:2)

此:

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

修改向量内的智能指针。它不再管理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];
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

getAt1的问题在于向量中的元素然后为空。我认为您想改为getAt2