存在别名构造的shared_ptr时reset原实例会产生什么效果?
问题核心原因
你混淆了shared_ptr对象本身的状态和它所关联的控制块的引用计数:
- 别名构造的作用是让
son和father共享同一个控制块,控制块里存储的是整个共享所有权的总引用计数。 - 每个
shared_ptr是独立的对象,use_count()方法返回的是当前这个shared_ptr所关联的控制块的引用计数,如果这个shared_ptr没有关联任何控制块,就返回0。
reset()方法的作用
调用father.reset()时,只会修改father这个对象本身的状态:
- 让
father放弃对原有控制块的所有权,对应控制块的总引用计数减1(从2变成1) - 将
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
相关产品推荐
相关产品推荐

