C++ 我应该使用共享\u ptr还是唯一\u ptr?

C++ 我应该使用共享\u ptr还是唯一\u ptr?,c++,c++11,shared-ptr,smart-pointers,unique-ptr,C++,C++11,Shared Ptr,Smart Pointers,Unique Ptr,我有一个关于和的问题。我知道关于什么时候使用哪一个有很多问题,但我仍然不确定我是否理解正确。我在某个地方读到,智能指针的默认选择应该是std::unique\u ptr,但据我所知,出于我的需要,我宁愿使用std::shared\u ptr。例如,我有: class B; class A { private: B* b; public: B* getB(); }; A::getB() { return b; } 所以基本上类A拥有指向B类型的对象的指针,并且有一个方法返回这

我有一个关于和的问题。我知道关于什么时候使用哪一个有很多问题,但我仍然不确定我是否理解正确。我在某个地方读到,智能指针的默认选择应该是
std::unique\u ptr
,但据我所知,出于我的需要,我宁愿使用
std::shared\u ptr
。例如,我有:

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

A::getB()
{
   return b;
}

所以基本上类
A
拥有指向
B
类型的对象的指针,并且有一个方法返回这个指针。如果我创建getter,我假设其他一些类可以访问这个指针,因此它应该是
shared\u ptr
而不是
unique\u ptr
。我是对的,还是我还不明白?

您返回的是一个裸指针,而不是一个
共享的\u ptr
,因此共享指针将无法解决任何问题。返回
共享的\u ptr
,或使用
唯一的\u ptr
。试着想想怎样才能实现共享,我相信这会让我的观点更清楚。

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

为了示例起见,让我们假设确实需要一个指针,只需
B
不会剪切它(例如,可能B是多态的)

情景阿尔法 所以,A是B的所有者

private:
   std::unique_ptr<B> b;
情景测试 A是B的所有者之一

private:
   std::shared_ptr<B> b;
private:
std::共享的ptr b;
A可以把B的所有权给其他人

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


std::shared_ptr<B> A::getB()
{
   return b;
}
公共:
std::shared_ptr getB();
std::shared_ptr A::getB()
{
返回b;
}

问题中没有足够的信息

智能指针捕获并实现所有权语义。如果
A
对象拥有
B
对象,那么销毁
A
应该销毁
B
,然后使用
unique\u ptr
。但是
unique\u ptr
在这里不是一个好的返回类型。它只会是成员,您仍然会返回一个空指针

如果获得
B
意味着客户可以无限期地继续使用
B
,那么请使用
shared\u ptr
,因为这将是共享所有权。

简短回答:视情况而定

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

  • 如果在使用
    getB
    的结果时A仍然存在,则可以存储
    唯一的\u ptr
    并返回一个普通指针(如果
    getB
    无法返回
    nullptr
    ,则返回一个引用)。这表示“A拥有B,其他人没有”
  • 如果在您使用/持有
    getB
    的结果时,A可能超出范围,但B应该与A一起(或之后不久)超出范围,则存储A
    shared\u ptr
    并返回A
    weak\u ptr
  • 如果可能有许多对象,包括
    getB
    的调用者,可能会保留到B,并且没有明确的单一所有者,则存储并返回
    shared\u ptr
    s

如果需要共享指针,请使用
std::shared\u ptr
。如果您不需要共享指针,请使用
std::unique_ptr
。可能的dup of和/或@JoachimPileborg如果他像他一样返回一个裸指针,那么使用
shared_ptr
场景alpha不考虑b为空的可能性。它取决于这种可能性和返回的ptr/ref的使用情况,如果
getB
应该返回一个引用、一个普通指针或一个
弱ptr
,后者当然需要一个存储的
共享的ptr
public:
   std::shared_ptr<B> getB();


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