【问题标题】:How to properly return a unique_ptr from a vector? [closed]如何从向量中正确返回 unique_ptr? [关闭]
【发布时间】:2019-11-13 14:57:33
【问题描述】:

让代码自己解释:

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 一样返回。

你有什么意见?

谢谢。

【问题讨论】:

  • 这取决于你想要什么。是否要从向量中删除指针?或者您是否想要一个指向与向量中的指针相同的对象的指针?向量是否总是比你从函数返回的指针寿命长?

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


【解决方案1】:

这个:

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

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

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

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

通常的警告适用于此。如果 cache 中的 unique_ptr 发生更改(销毁、重新分配、重置等),则该引用可能会失效。返回的引用仅供短期使用。

这当然假设unique_ptr 永远不是nullptr。目前尚不清楚您是否允许在cache 中使用nullptr 值。如果是,则不要返回参考。根据您的 getAt2() 示例,返回原始指针。同样的警告仍然适用。如果unique_ptr发生变化,返回的指针将失效。

最后,所有这一切都假定SomeClasscacheMyType 对象的所有者,而get() 函数仅授予对对象的临时、非拥有访问权限。如果没有,那么你应该切换到shared_ptr,并返回一个shared_ptr

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

【讨论】:

  • 1.它肯定会是nullptr。移动构造函数修改 rhs。 2. 引用是可以的,但是如果指针为空,它是未定义的行为,所以我们在这里必须小心。
【解决方案2】:

您可能已经知道,您可以使用 shared_ptr 代替 unique_ptr。

【讨论】:

  • 我建议 shared_ptr 是一种代码味道。
【解决方案3】:

getAt1 的问题是向量中的元素是空的。我想你想改用getAt2

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2016-07-22
    • 2012-08-31
    • 1970-01-01
    • 2014-10-25
    • 2020-01-16
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    相关资源
    最近更新 更多