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



我想知道什么时候应该使用unique_ptr(或boost::scope_ptr)而不是本地对象。

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

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

  2. 多态性。例如CCD_ 3。但我不确定我们什么时候需要这个。如果这个p是一个函数的参数,我们可以简单地说:if ... foo(new C1); else foo(new C2);

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

多态性

多态性是一个常见的原因。一个典型的例子是,您的对象是由一个返回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;
}

CCD_ 12的开销比CCD_ 13小,并且使所有权更加清晰。只有在需要共享所有权的情况下,我才会使用shared_ptr

unique_ptr传递到函数中意味着将所有权转移到函数中("接收器")。例如构造函数:

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...
}

相关内容

  • 没有找到相关文章

最新更新