【问题标题】:C++: Using shared_ptr<...> over raw ptrC++:在原始 ptr 上使用 shared_ptr<...>
【发布时间】:2023-04-03 17:58:01
【问题描述】:

我有一个关于在原始 ptr 上使用 shared_ptr&lt;...&gt; 的问题。考虑以下示例:

shared_ptr<BaseClass> someName = shares_ptr<Derived>(new Derived);
shared_ptr<BaseClass> someName1 = shares_ptr<Derived1>(new Derived1(someName));

这里,Derived1shared_ptr&lt;BaseClass&gt; 的实例作为其构造函数的输入。我使用 shared_ptr 主要是为了多态性。由于一个BaseClass 实例可以用作多个其他Derived 实例的输入,因此unique_ptr 不是一种选择,因为我必须一直更改所有权。

但所有权是我主要关心的问题。派生实例不拥有传递给构造函数的实例。通过原始ptr更好吗?

【问题讨论】:

  • Raw 与 @Oblivion 所说的 unique_ptrshared_ptr 有一个完全不同的用例——尽管我不同意你有一个使用它的案例。
  • @TedLyngmo 我同意,这里 shared_ptr 似乎不是一个好选择。谢谢我编辑了我的答案。
  • @Oblivion 我必须承认我还没有找到shared_ptr 的用途,除了修补时。我可能有偏见,但我永远不会把它放在我的设计中。
  • @TedLyngmo 我相信如果一个人有可维护的软件,这是正确的决定。
  • @Bastian 您所描述的是否与shared_ptr/weak_ptr 有本质上的关系?如果是这样 - 你做对了!

标签: c++ c++11 smart-pointers


【解决方案1】:

如果您需要管理指针的所有权,根据经验,总是更喜欢unique_ptr 而不是原始指针。如果您有原因(即如果您共享所有权,而不是一次与一个所有者转让所有权),则更喜欢 shared_ptr 而不是原始指针。

如果您需要使用指针但不管理其生命周期,请使用 shared_ptr 进行管理,使用 weak_ptr 使用没有生命周期管理的指针。

您仍然可能会发现一些原始指针的用例,例如在辅助函数中需要格外小心,以免意外生成悬空指针。

【讨论】:

  • always prefer unique_ptr over raw pointer 该声明非常含糊。直到 observer_ptr 在标准中,您仍然需要原始指针,只要您需要传递一个对象而不是所有权(对于您传递一个对象的大多数辅助函数来说都是这种情况)。现在不应该使用原始指针来表达/管理所有权。
猜你喜欢
  • 2011-04-22
  • 2011-03-04
  • 1970-01-01
  • 2012-09-07
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多