V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
silencht
V2EX  ›  C++

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

  •  
  •   silencht · 2022-07-14 13:55:26 +08:00 · 1289 次点击
    这是一个创建于 847 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    感谢!

    3 条回复    2022-07-14 19:00:16 +08:00
    exch4nge
        1
    exch4nge  
       2022-07-14 14:17:47 +08:00 via iPhone   ❤️ 2
    分着理解吧,unique 就是判断引用计数是不是一,即没有其它 shared ptr 只向同一个对象。

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


    那段代码做的事情就是,如果不是 unique 那就复制一份,保证 p 指向的是 unique 的,做+=操作
    lxdlam
        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 ,在需要修改时复制一份数据单独维护。
    chanchancl
        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 进行 += 操作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4289 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:02 · PVG 09:02 · LAX 17:02 · JFK 20:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.