调用std::make_shared后std::shared_ptr弱引用计数为何非零?
这不是调试器的海森堡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
相关产品推荐
相关产品推荐

