【问题标题】:Why can't intrusive_ptr and shared_ptr be used with boost::intrusive containers?为什么 intrusive_ptr 和 shared_ptr 不能与 boost::intrusive 容器一起使用?
【发布时间】:2012-12-02 00:35:02
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    也许documentation for boost::intrusive::slist 中有一条线索,它指出在默认配置下,slist 存储为循环列表,这排除了使用shared_ptr/intrusive_ptr 和朋友,因为你会有一个参考循环。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 正如我在我的问题中所说,他们不内部管理内存。您必须自己分配和释放进入侵入式容器的物品。从容器中添加/删除项目不会执行分配/释放和复制。
      【解决方案3】:

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

      【讨论】:

      • 我提到 intrusive_ptr 没有这个问题。这也不能真正回答问题,这就是为什么文档说你不能这样做。这与它是否是一个好主意不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多