我应该使用shared_ptr还是unique_ptr?

时间:2013-02-14 09:33:35

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

我对std::unique_ptrstd::shared_ptr有疑问。我知道有很多关于何时使用哪一个的问题,但我仍然不确定我是否正确理解它。我在某处读到智能指针的默认选择应该是std::unique_ptr,但据我了解,根据我的需要,我应该使用std::shared_ptr。例如,我有:

class B;
class A
{
private:
   B* b;
public:
   B* getB();
};

A::getB()
{
   return b;
}

所以基本上类A拥有指向类型为B的对象的指针,并且有一个返回此指针的方法。如果我创建了getter,我假设其他一些类可以访问此指针,因此它应该是shared_ptr而不是unique_ptr。我是对的,还是我还没有得到它?

5 个答案:

答案 0 :(得分:24)

简短回答:取决于。

这取决于getB返回的指针是否可以在拥有A超出范围时在某处存储/使用。区别在于所有权而不是你有多少指针。

  • 如果在使用getB的结果时A仍然存在,则可以存储unique_ptr并返回普通指针(如果getB永远不会返回{{1,则返回引用}})。这表示“A拥有B,没有其他人做”。
  • 如果在使用/保持结果nullptr时A可能超出范围,但B应与A一起(或不久之后)超出范围,则存储{{1}并返回getB
  • 如果可能有多个对象(包括shared_ptr的来电者)可能会抓住B并且没有明确的单一所有者,请存储并返回weak_ptr s。

答案 1 :(得分:7)

我们假设为了示例,确实需要一个指针,而B b;只是不切割它(例如,B可能是多态的。)

情景alpha

所以,A是 B的所有者。

private:
   std::unique_ptr<B> b;

getB提供了该B的视图。

public:
   B& getB();


B& A::getB()
{
   return *b;
}

Scenario beta

A是其中一个 B的所有者。

private:
   std::shared_ptr<B> b;

A可以将B的所有权归给他人。

public:
   std::shared_ptr<B> getB();


std::shared_ptr<B> A::getB()
{
   return b;
}

答案 2 :(得分:2)

您返回一个裸指针,而不是shared_ptr,因此使指针共享将不会解决任何问题。要么返回shared_ptr,要么使用unique_ptr。试着想一想如何才能实现shared_ptr,我相信这应该清楚我的观点。

答案 3 :(得分:2)

我认为你是对的。 如果您只将B指针作为A中的私人成员,我想我会使用std::unqiue_ptr

答案 4 :(得分:2)

问题中没有足够的信息。

智能指针捕获并实现所有权语义。如果A对象拥有B对象,则销毁A会破坏B,然后使用unique_ptr。但是unique_ptr在这里没有做出好的回报类型。它只会是成员,你仍然会返回一个裸指针。

如果获得B表示客户端可以无限期地继续使用B,那么请使用shared_ptr,因为这将是共享所有权。