与赋值类似,reset 会更新引用计数,如果需要的话,会释放 p 指向的对象。reset 成员经常与 unique 一起使用,来控制多个 shared_ptr 共享的对象。在改变底层对象之前,我们检查自己是否是当前对象仅有的用户。如果不是,在改变之前要制作一份新的拷贝:
if(!p.unique())
p.reset(new string (*p)); //我们不是唯一用户;分配新的拷贝
*p += newVal;//现在我们知道自己是唯一的用户,可以改变对象的值
这段话和代码的含义 v2er 们 可以解释一下吗?一直不太理解他这段话和代码的意义
感谢!
1
exch4nge 2022-07-14 14:17:47 +08:00 via iPhone 2
分着理解吧,unique 就是判断引用计数是不是一,即没有其它 shared ptr 只向同一个对象。
reset 就是指向一个新的对象,原来的引用计数减一可能会释放。 那段代码做的事情就是,如果不是 unique 那就复制一份,保证 p 指向的是 unique 的,做+=操作 |
2
lxdlam 2022-07-14 14:26:42 +08:00 1
- `shared_ptr<T>` 的结构由两部分组成:control block 和 data block ,其中 control block 负责控制引用计数,并发安全,但是 data block 无任何并发安全保证。
- `shared_ptr<T>::unique()` 负责检查是否仅有一个用户在使用(即自己)。 所以这是一个比较简单的 CoW(Copy-oon-Write) pattern ,在需要修改时复制一份数据单独维护。 |
3
chanchancl 2022-07-14 19:00:16 +08:00 1
假如 p 和 q 指向同一对象,那么对 p 的修改也会影响 q
通过 !p.unique()判断 p 是否唯一指向对象,如果不唯一,则通过 p.reset 构造一个新的 string ,拷贝*p ,此时 p 和 q 就分别指向两个内容相同,但地址不同的对象了 最后对 p 进行 += 操作 |