[提问帖] C++ Primer 12.1.3 章节中 shared_prt 的 reset 成员与 unique 一起使用的示例的意思

2022-07-14 13:55:26 +08:00
 silencht

与赋值类似,reset 会更新引用计数,如果需要的话,会释放 p 指向的对象。reset 成员经常与 unique 一起使用,来控制多个 shared_ptr 共享的对象。在改变底层对象之前,我们检查自己是否是当前对象仅有的用户。如果不是,在改变之前要制作一份新的拷贝:

if(!p.unique())
	p.reset(new string (*p)); //我们不是唯一用户;分配新的拷贝
*p += newVal;//现在我们知道自己是唯一的用户,可以改变对象的值

这段话和代码的含义 v2er 们 可以解释一下吗?一直不太理解他这段话和代码的意义

感谢!

1342 次点击
所在节点    C++
3 条回复
exch4nge
2022-07-14 14:17:47 +08:00
分着理解吧,unique 就是判断引用计数是不是一,即没有其它 shared ptr 只向同一个对象。

reset 就是指向一个新的对象,原来的引用计数减一可能会释放。


那段代码做的事情就是,如果不是 unique 那就复制一份,保证 p 指向的是 unique 的,做+=操作
lxdlam
2022-07-14 14:26:42 +08:00
- `shared_ptr<T>` 的结构由两部分组成:control block 和 data block ,其中 control block 负责控制引用计数,并发安全,但是 data block 无任何并发安全保证。
- `shared_ptr<T>::unique()` 负责检查是否仅有一个用户在使用(即自己)。

所以这是一个比较简单的 CoW(Copy-oon-Write) pattern ,在需要修改时复制一份数据单独维护。
chanchancl
2022-07-14 19:00:16 +08:00
假如 p 和 q 指向同一对象,那么对 p 的修改也会影响 q

通过 !p.unique()判断 p 是否唯一指向对象,如果不唯一,则通过 p.reset 构造一个新的 string ,拷贝*p ,此时 p 和 q 就分别指向两个内容相同,但地址不同的对象了

最后对 p 进行 += 操作

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866130

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX