shared_ptr与weak_ptr实现疑问:ControlBlock的定义方式抉择
在实现shared_ptr和weak_ptr时,两种方案都可行,但各有优劣,下面具体分析:
方案一:将weak_ptr设为shared_ptr的友元
- 优势:
ControlBlock可以完全封装在shared_ptr的私有区域,严格遵循封装原则,外部代码无法直接接触控制块细节。 - 劣势:会强化
shared_ptr与weak_ptr的耦合关系,后续修改其中一个的内部逻辑时,必须考虑对另一个的影响。如果还有其他组件(比如enable_shared_from_this)需要访问ControlBlock,就得持续添加友元声明,容易导致"友元泛滥",破坏代码的模块化结构。
方案二:将ControlBlock定义在shared_ptr外部(细节命名空间中)
- 优势:大幅降低组件间耦合,
weak_ptr、enable_shared_from_this等相关类可以直接访问ControlBlock,无需依赖友元关系。通常可以把ControlBlock放在类似namespace detail的内部命名空间中,既保证相关组件能访问,又避免对外暴露实现细节。 - 劣势:需要额外处理命名空间的划分,确保控制块不会被无关代码误用,但这在C++的模块化实践中是很常规的操作。
实际建议
如果是学习阶段的实现,两种方案都可以尝试。但从工业级实现的角度(比如C++标准库的主流实现),更推荐第二种方案——用内部细节命名空间存放ControlBlock。这种方式扩展性更强,能更好地支持后续新增的相关组件,同时保持对外的封装性。
内容的提问来源于stack exchange,提问作者Amir Mokhammed-Ali
相关产品推荐
相关产品推荐

