You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于shared_ptr.unique()与reset()配合使用的疑问(C++ Primer第5版)

关于shared_ptr中unique()与reset()的逻辑解释

首先明确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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:33:14