【问题标题】:C++: Two separate `make_shared` calls to same object will create two separate and independent shared_ptr and its control block?C ++:对同一对象的两次单独的“make_shared”调用将创建两个单独且独立的shared_ptr及其控制块?
【发布时间】:2021-01-29 22:51:06
【问题描述】:
  1. 在下面的代码中,我的理解是 a 和 b 不共享所有权。相反,它们是两个独立的智能指针,每个都有单独的控制块,ref_count = 1。 我的理解正确吗?
std::shared_ptr<Foo> a = make_shared<Foo>();
std::shared_ptr<Foo> b = make_shared<Foo>();
  1. 使用shared_ptr 共享所有权并增加ref_cnt 的正确方法是调用make_shared 一次初始化内存并使用copy/assign 增加ref_cnt 并共享所有权。例如:
std::shared_ptr<Foo> a = make_shared<Foo>();
auto b = a;
auto b(a);

我上面提到的两点对吗?

提前谢谢你!

【问题讨论】:

  • 是的,你的理解是正确的。

标签: c++ shared-ptr smart-pointers


【解决方案1】:

你在所有方面都是正确的。让多个shared_ptr 对象链拥有同一个对象并不是一个好主意。

【讨论】:

  • 感谢您的回答和确认!
【解决方案2】:

std::make_shared&lt;Foo&gt; 将新建 Foo 对象并返回一个共享的 ptr 到该对象。如果你调用std::make_shared,同样的事情会再次发生,你将拥有另一个(独立的)Foo 对象。


有趣的是:您可以获得(意外)唯一定义对象共享的一个实例是string literals

【讨论】:

  • 感谢您的回答和确认!关于字符串文字确实很有趣的旁注!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 2019-07-24
  • 1970-01-01
相关资源
最近更新 更多