我应该使用shared_ptr还是unique_ptr?

dzi*_*wna 25 c++ smart-pointers shared-ptr unique-ptr c++11

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

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

A::getB()
{
   return b;
}
Run Code Online (Sandbox Code Playgroud)

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

Arn*_*rtz 24

简答:取决于.

这取决于返回的指针是否getB可以在拥有A超出范围时存储/使用.不同之处在于所有权不是关于你有多少指针.

  • 如果在使用结果时A仍然存在getB,则可以存储unique_ptr并返回普通指针(如果getB永远不能返回,则返回引用nullptr).这表示"A拥有B,没有其他人做".
  • 如果在使用/持有结果时A可能超出范围getB,但是B应该与A一起(或在A之后不久)超出范围,则存储shared_ptr并返回a weak_ptr.
  • 如果可能有许多对象(包括呼叫者getB)可以抓住B并且没有明确的单一所有者,则存储和返回shared_ptr.


R. *_*des 7

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

场景alpha

所以,A是B 所有者.

private:
   std::unique_ptr<B> b;
Run Code Online (Sandbox Code Playgroud)

getB提供了B的视图.

public:
   B& getB();


B& A::getB()
{
   return *b;
}
Run Code Online (Sandbox Code Playgroud)

情景测试版

A是的一个一个B.业主

private:
   std::shared_ptr<B> b;
Run Code Online (Sandbox Code Playgroud)

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

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


std::shared_ptr<B> A::getB()
{
   return b;
}
Run Code Online (Sandbox Code Playgroud)