为什么不能将intrusive_ptr和shared_ptr与boost :: intrusive容器一起使用?

时间:2012-12-14 01:31:21

标签: c++ boost shared-ptr smart-pointers intrusive-containers

boost :: intrusive文档描述了you can use smart pointers with intrusive containers的方式,但后来说你不能使用你最有可能使用的智能指针,“它必须具有与原始指针相同的所有权语义。意味着不能使用资源管理智能指针(如boost :: shared_ptr)。“

这是为什么?我想不出他们应该被禁止的任何明显理由。究竟会打破什么?侵入式容器无论如何都不管理其中的项目分配。在我的情况下,我想使用intrusive_ptr,但我没有看到为什么shared_ptr不应该工作的原因。

编辑:要清楚,我的意思是钩子指针(例如侵入式单链表中的下一个指针)是一个智能指针。

3 个答案:

答案 0 :(得分:2)

也许在documentation for boost::intrusive::slist中有一条线索,它指出使用默认配置时,slist会被存储为循环列表,从而无法使用shared_ptr / intrusive_ptr和朋友,因为你有一个参考周期。

令人讨厌的是,一部分助推器不能与另一部分正常工作;我想唯一的解决方法是使用像intrusive_ptr这样的东西,并在向容器添加对象时手动触发引用计数,并在删除它时减少它。 (这排除了shared_ptr,因为您无法直接调整其引用计数。)

答案 1 :(得分:0)

一个明显的原因是效率。 shared_ptr使用原子递增/递减操作来计算引用。这意味着在引擎盖下使用shared_ptr指针处理足够大的容器需要几秒钟,因为每个引用计数器都需要以原子方式递减。

答案 2 :(得分:0)

据推测,这是因为侵入式容器已经在内部管理内存(如增强ptr_容器),而不是创建两个不同的侵入式容器实现(一个用于非拥有指针,一个用于拥有),他们决定放置可以使用对点类型的限制。