首先我们有一个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。看起来相反。
感谢您的帮助。
散布在程序中的各种
shared_ptr
都是 shared_ptr
的不同实例,在本例中,它们可能指向同一个对象。如果只有一个 shared_ptr
指代对象 O
,我们可以毫无顾忌地更改 O
。否则,我们希望防止 shared_ptr
的其他持有者受到某个持有者对 O
所做更改的影响。
因此,如果有多个
shared_ptr
实例指向该对象,我们会复制该对象。
P1
指向OP2
指向O由于我们有多个 P 指向
O
,因此我们复制 O
,以便 P2 的所有者看不到 P1 的所有者希望进行的更改。我们最终会得到
P1
指向Copy
P2
指向O
现在
P1
是唯一引用Copy
的指针,P1的持有者可以在不影响P2
的情况下进行更改。并且由于 P2
是指向 O
的唯一指针,因此将来它可以在不复制 O
的情况下进行更改,除非 P2
被复制到 P3
并且我们再次拥有 O
的多个“所有者” .
有时您会在字符串实现中看到类似的行为。当您复制此类字符串时,两个字符串通过共享源字符串的数据来节省存储空间和时间。但是,如果任一字符串需要更改该数据,则需要支付新副本的费用,以便它是唯一更改的。