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

存在别名构造的shared_ptr时reset原实例会产生什么效果?

问题核心原因

你混淆了shared_ptr对象本身的状态和它所关联的控制块的引用计数:

  • 别名构造的作用是让son和father共享同一个控制块,控制块里存储的是整个共享所有权的总引用计数。
  • 每个shared_ptr是独立的对象,use_count()方法返回的是当前这个shared_ptr所关联的控制块的引用计数,如果这个shared_ptr没有关联任何控制块,就返回0。

reset()方法的作用

调用father.reset()时,只会修改father这个对象本身的状态:

  1. 让father放弃对原有控制块的所有权,对应控制块的总引用计数减1(从2变成1)
  2. 将father内部的控制块指针、数据指针都置为空

这时候father已经不关联任何控制块了,所以它的use_count()返回0是完全符合标准规定的。你之前看到的说法里提到的“此时use_count为1”,指的是原有控制块的总引用计数,也就是son.use_count()的返回值,而非被重置后的father的use_count。

输出结果对应说明

  • 前两次输出2:father和son都关联同一个控制块,控制块总引用计数为2
  • father.reset()后father.use_count()输出0:father已被置空,无关联控制块
  • son.use_count()输出1:son仍关联原有控制块,此时总引用计数为1
  • 最后两次owner_before输出1和0:owner_before基于控制块地址比较,空shared_ptr的排序优先级高于非空shared_ptr,符合标准行为。

内容的提问来源于stack exchange,提问作者calvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:30:04