27

我有一个关于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;
}

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

4

5 回答 5

24

简短的回答:取决于。

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

  • 如果在使用 的结果时 A 仍然存在getB,则可以存储 aunique_ptr并返回一个普通指针(如果getB永远无法返回,则返回一个引用nullptr)。这表示“A拥有B,而没有其他人拥有”。
  • 如果在您使用/保存 的结果时 A 可能超出范围getB,但 B 应该与 A 一起(或不久之后)超出范围,存储 ashared_ptr并返回 a weak_ptr
  • 如果可能有许多对象,包括 的调用者getB,可能会持有 B 并且没有明确的单一所有者,存储和返回shared_ptrs。
于 2013-02-14T09:44:27.570 回答
7

为了举例,我们假设确实需要一个指针并且只是B b;不剪切它(例如,也许 B 是多态的)。

情景阿尔法

所以,A 是B所有者。

private:
   std::unique_ptr<B> b;

getB提供 B 的视图。

public:
   B& getB();


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

场景测试版

A 是B 的所有者之一

private:
   std::shared_ptr<B> b;

A 可以将 B 的所有权转让给其他人。

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


std::shared_ptr<B> A::getB()
{
   return b;
}
于 2013-02-14T09:38:13.610 回答
2

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

于 2013-02-14T09:35:59.073 回答
2

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

于 2013-02-14T09:36:02.187 回答
2

问题中没有足够的信息。

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

如果获得客户端可以无限期B继续使用的手段,那么使用,因为那将是共享所有权。Bshared_ptr

于 2013-02-14T09:38:16.923 回答