boost :: intrusive文档描述了you can use smart pointers with intrusive containers的方式,但后来说你不能使用你最有可能使用的智能指针,“它必须具有与原始指针相同的所有权语义。意味着不能使用资源管理智能指针(如boost :: shared_ptr)。“
这是为什么?我想不出他们应该被禁止的任何明显理由。究竟会打破什么?侵入式容器无论如何都不管理其中的项目分配。在我的情况下,我想使用intrusive_ptr,但我没有看到为什么shared_ptr不应该工作的原因。
编辑:要清楚,我的意思是钩子指针(例如侵入式单链表中的下一个指针)是一个智能指针。
答案 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_
容器),而不是创建两个不同的侵入式容器实现(一个用于非拥有指针,一个用于拥有),他们决定放置可以使用对点类型的限制。