关于shared_ptr.unique()与reset()配合使用的疑问(C++ Primer第5版)
首先明确shared_ptr::unique()的含义:它返回true时,代表当前shared_ptr是指向对象的唯一持有者(等价于use_count() == 1);返回false时,说明还有其他shared_ptr也共享这个对象(use_count() > 1)。
书中的逻辑完全正确,核心目的是实现独占修改——当你想修改*p但不想影响其他共享该对象的指针时,才需要做这个操作:
- 当
!p.unique()(也就是有其他指针共享对象):如果直接修改*p,所有共享该对象的指针都会看到修改后的结果,这通常不符合“独占修改”的需求。所以此时调用p.reset(new int(*p)),创建一个原对象的副本,让p指向这个新副本,此时p就成了新对象的唯一持有者,之后修改*p就只会影响自己,不会干扰其他指针。 - 当
p.unique()(use_count() == 1):说明没有其他指针依赖这个对象,直接修改*p即可,完全不需要reset——因为不会影响任何其他代码。
举个实际场景例子:
shared_ptr<int> p(new int(42)); shared_ptr<int> q = p; // 此时p.use_count()=2,p.unique()=false // 如果直接修改 *p = 100; cout << *q << endl; // 输出100,q也被影响了 // 按照书中逻辑处理 if (!p.unique()) { p.reset(new int(*p)); // p现在指向新的int(42),use_count()=1 } *p = 100; cout << *q << endl; // 输出42,q不受影响
内容的提问来源于stack exchange,提问作者yapkm01
相关产品推荐
相关产品推荐

