6

boost::intrusive 文档描述了如何将智能指针与侵入式容器一起使用,但随后说您不能使用最有可能使用的智能指针,“它必须具有与原始指针相同的所有权语义。这意味着不能使用资源管理智能指针(如 boost::shared_ptr)。”

为什么是这样?我想不出任何明显的理由应该禁止它们。究竟会破坏什么?侵入式容器无论如何都不管理它们内部项目的分配。就我而言,我想使用 intrusive_ptr,但我看不出为什么 shared_ptr 也不应该工作。

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

4

3 回答 3

2

也许文档中boost::intrusive::slist有一条线索,说明它在哪里声明使用默认配置,slist存储为一个循环列表,这排除了使用shared_ptr/intrusive_ptr和朋友,因为你有一个参考循环。

boost 的一部分不能与另一部分正常工作仍然很烦人;我想唯一的解决方法是在intrusive_ptr将对象添加到容器时使用类似的方法并手动增加引用计数,并在删除它时减少它。(这排除了shared_ptr,因为你不能直接调整它的引用计数。)

于 2013-03-23T19:26:43.513 回答
0

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

于 2012-12-14T06:51:42.617 回答
0

大概这是因为侵入式容器已经在内部管理了内存(如升压ptr_容器),而不是创建两个不同的侵入式容器实现(一个用于非拥有指针,一个用于拥有),他们决定限制什么类型点可以使用。

于 2012-12-14T14:35:42.650 回答