何时使用unique_ptr而不是本地对象?

时间:2014-09-27 06:13:46

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

我想知道何时应该使用unique_ptr(或boost::scope_ptr)代替本地对象。

我可以想到两种可能的情况:

  1. 超过线程堆栈大小的对象很大。但在这种情况下,您总是可以增加线程的大小。

  2. 多态性。例如unique_ptr<C> p; if ... p.reset(new C1); else p.reset(new C2);。但我不确定我们到底需要什么。如果此p是函数的参数,我们只需说:if ... foo(new C1); else foo(new C2);

  3. 是否还有其他情况我们应该使用unique_ptr而不是本地对象?

1 个答案:

答案 0 :(得分:4)

多态性

多态性是一个常见的原因。一个典型的例子是您的对象是由返回unique_ptr

的工厂创建的
std::unique_ptr<C> factoryFunction(int arg) {
  switch (arg) {
    case 1:
      return std::make_unique<C1>();
    case 2:
      return std::make_unique<C2>();
    default:
      return nullptr; 
  }
}

void someFunction(int arg) {
  auto c = factoryFunction(arg);
  if (c) {
    // do something with c...
  }
}

转让所有权

在评论中,如果您需要一个比声明范围更长的变量,则表示您更喜欢shared_ptr。我认为你应该更喜欢unique_ptr。通过返回unique_ptr,您将所有权转移给来电者。就像上面的factoryFunction一样。或者也许是为了返回一个昂贵的移动物体:

using BigArray = std::array<BigPOD, 1000>;

std::unique_ptr<BigArray> getBig() {
  auto big = std::make_unique<BigArray>();
  // fill big...
  return big;
}

unique_ptr的开销低于shared_ptr,它使所有权更加清晰。如果需要共享所有权,我只会使用shared_ptr

unique_ptr传递给函数意味着您将所有权转移到函数中(&#34;接收器&#34;)。例如构造函数:

class Foo {
 private:
  std::unique_ptr<BigArray> array_;
 public:
  Foo(std::unique_ptr<BigArray> array) : array_(std::move(array)) {}
};

void someFunction() {
    auto big = getBig();
    auto foo = Foo(std::move(big));
    // do something with foo...
}