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

调用std::make_shared后std::shared_ptr弱引用计数为何非零?

问题解析:std::enable_shared_from_this导致弱引用计数为2的原因

这不是调试器的海森堡bug,核心原因是std::enable_shared_from_this内部会自动持有一个指向控制块的弱引用,具体细节如下:

  • 当类继承std::enable_shared_from_this<T>时,该基类内部会包含一个隐藏的std::weak_ptr<T>成员(不同编译器实现细节可能有差异,但逻辑一致)。
  • 当你通过std::make_shared或直接构造std::shared_ptr指向该类对象时,std::shared_ptr的构造函数会自动初始化这个内部的weak_ptr,让它绑定到当前对象的控制块上,这会直接让控制块的弱引用计数+1。
  • 你创建了两个独立的std::shared_ptr对象a和b,每个对象对应的Value实例都继承了std::enable_shared_from_this,因此每个实例的内部weak_ptr都会各自贡献1个弱引用,最终控制块的弱引用计数就是2,这完全符合标准库的设计逻辑。

调试器显示的计数是准确的,它并没有额外引入计数变化——所谓的"海森堡bug"在这里不成立,因为调试器只是读取了控制块的现有状态,而非修改它。

另外补充:即使你没有显式调用shared_from_this(),只要对象被std::shared_ptr管理,std::enable_shared_from_this的内部弱引用就会存在,弱引用计数也会相应增加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:52:05