关于c ++:我应该使用shared_ptr还是unique_ptr?

Should I use shared_ptr or unique_ptr?

本问题已经有最佳答案,请猛点这里访问。

我有一个关于EDOCX1,0,EDCX1,1的问题。我知道有很多关于何时使用哪一个的问题,但我仍然不确定我是否理解正确。我在某个地方读到智能指针的默认选择应该是std::unique_ptr,但据我所知,出于我的需要,我更应该使用std::shared_ptr。例如,我有:

1
2
3
4
5
6
7
8
9
10
11
12
13
class B;
class A
{
private:
   B* b;
public:
   B* getB();
};

A::getB()
{
   return b;
}

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


简短回答:视情况而定。

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

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

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

场景阿尔法

所以,A是B的所有者。

1
2
private:
   std::unique_ptr b;

getB则提供了一个B的观点。

1
2
3
4
5
6
7
8
public:
   B& getB();


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

方案β

A是B的所有者之一。

1
2
private:
   std::shared_ptr b;

A可以把B的所有权给其他人。

1
2
3
4
5
6
7
8
public:
   std::shared_ptr getB();


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


这个问题没有足够的信息。

智能指针捕获并实现所有权语义。如果EDCOX1×5的对象拥有EDCOX1×4的对象,那么销毁EDCOX1的5Ω应该破坏EDCOX1×4,然后使用EDCOX1×2。但是EDCX1〔2〕在这里没有很好的返回类型。它只是成员,你仍然会返回一个空指针。

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


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


您返回的是一个空指针,而不是一个shared_ptr,因此使指针共享不会解决任何问题。或者返回shared_ptr,或者使用unique_ptr。试着想想怎么可能实现shared_ptr,我相信这应该说明我的观点。