C++ Primer 5th Ed - Stanley Lipmann:关于与shared_ptr.reset()结合使用的shared_ptr.unique()的问题

问题描述 投票:0回答:1

首先我们有一个shared_ptr定义如下:

shared_ptr<int> p(new int(42)); 

根据以下文字:

重置成员经常与特有的一起使用 控制对多个shared_ptr 之间共享的对象的更改。变更前 底层对象,我们检查我们是否是唯一的用户。如果没有,我们就制作一个新的 进行更改之前复制:

if (!p.unique())
    p.reset(new string(*p)); // we aren't alone; allocate a new copy
*p += newVal; // now that we know we're the only pointer, okay to change this object

问题:
难道我们不应该只在只有 1 个副本时重置 p (p.use_count() == 1)。
在这里,如果我没读错的话,我们会在 p.use_count() != 1 时重置 p。看起来相反。

感谢您的帮助。

c++ heap-memory c++20 dynamic-memory-allocation shared-ptr
1个回答
0
投票

散布在程序中的各种

shared_ptr
都是
shared_ptr
的不同实例,在本例中,它们可能指向同一个对象。如果只有一个
shared_ptr
指代对象
O
,我们可以毫无顾忌地更改
O
。否则,我们希望防止
shared_ptr
的其他持有者受到某个持有者对
O
所做更改的影响。

因此,如果有多个

shared_ptr
实例指向该对象,我们会复制该对象。

  • P1
    指向O
  • P2
    指向O

由于我们有多个 P 指向

O
,因此我们复制
O
,以便 P2 的所有者看不到 P1 的所有者希望进行的更改。我们最终会得到

  • P1
    指向
    Copy
  • P2
    指向
    O

现在

P1
是唯一引用
Copy
的指针,P1的持有者可以在不影响
P2
的情况下进行更改。并且由于
P2
是指向
O
的唯一指针,因此将来它可以在不复制
O
的情况下进行更改,除非
P2
被复制到
P3
并且我们再次拥有
O
的多个“所有者” .

有时您会在字符串实现中看到类似的行为。当您复制此类字符串时,两个字符串通过共享源字符串的数据来节省存储空间和时间。但是,如果任一字符串需要更改该数据,则需要支付新副本的费用,以便它是唯一更改的。

© www.soinside.com 2019 - 2024. All rights reserved.