为什么intrusive_ptr和shared_ptr不能与 boost::侵入式容器一起使用?



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

这是为什么呢?我想不出任何明显的理由应该禁止它们。究竟什么会破裂?无论如何,侵入性容器都不会管理其中项目的分配。就我而言,我想使用intrusive_ptr,但我看不出shared_ptr也没有任何理由不起作用。

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

也许boost::intrusive::slist文档中有一个线索,它指出,使用默认配置,slist存储为循环列表,这排除了使用 shared_ptr/intrusive_ptr 和朋友,因为您将有一个参考周期。

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

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

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

相关内容

  • 没有找到相关文章

最新更新