c++ - 我应该使用 shared_ptr 还是 unique_ptr?

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

我有一个关于 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。我是对的,还是我还不明白?

最佳答案

简短回答:取决于。

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

  • 如果使用 getB 的结果时 A 仍然存在,您可以存储一个unique_ptr并返回一个普通指针(如果 getB 永远无法返回 nullptr ,则返回一个引用)。这表示“A 拥有 B,而没有其他人拥有”。
  • 如果 A 在您使用/保存 getB 的结果时可能超出范围,但 B 应该与 A 一起(或不久之后)超出范围,存储 a shared_ptr并返回 weak_ptr .
  • 如果可能有很多对象,包括 getB 的调用者,可以坚持B,没有明确的单主,囤货返回shared_ptr s.

关于c++ - 我应该使用 shared_ptr 还是 unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14871640/

相关文章:

c++ - std::shared_ptr:未调用自定义删除器

c++ - 我应该如何在我自己的函数中传递 boost::asio::yield_context?

c++ - 为什么 std::weak_ptr 没有 operator->?

c++ - 显示实现最大利润的步骤

C++ WinAPI 使用 DWM 在自定义窗口框架上显示位图

c++ - c++11 中的 brace-init 是否存在任何效率问题?

c++ - 两个节点相互指向时不可避免的内存泄漏

c++ - 为什么 std::shared_ptr 控制 block 需要持有指向具有正确类型的托管对象的指针

c++ - 将文本解析成句子?

c++ - makefile 和多文件 C++ 模板问题