C++ 为什么可以';侵入式_ptr和共享_ptr不能与boost::侵入式容器一起使用吗?

C++ 为什么可以';侵入式_ptr和共享_ptr不能与boost::侵入式容器一起使用吗?,c++,boost,shared-ptr,smart-pointers,intrusive-containers,C++,Boost,Shared Ptr,Smart Pointers,Intrusive Containers,boost::intrusive文档描述了如何使用智能指针,但随后指出不能使用最可能使用的智能指针,“它必须与原始指针具有相同的所有权语义。这意味着不能使用资源管理智能指针(如boost::shared_ptr)。” 为什么会这样?我想不出任何明显的理由禁止他们。到底什么会断裂?侵入式容器无论如何都不会管理内部项目的分配。在我的例子中,我想使用侵入式的\u ptr,但我看不出为什么共享\u ptr也不能工作 编辑:明确地说,我的意思是钩子指针(例如,侵入式单链接列表中的下一个指针)是智能指针。一

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

为什么会这样?我想不出任何明显的理由禁止他们。到底什么会断裂?侵入式容器无论如何都不会管理内部项目的分配。在我的例子中,我想使用侵入式的\u ptr,但我看不出为什么共享\u ptr也不能工作


编辑:明确地说,我的意思是钩子指针(例如,侵入式单链接列表中的下一个指针)是智能指针。

一个明显的原因是效率<代码>共享_ptr使用原子递增/递减操作来计数引用。这意味着在引擎盖下处理使用
shared\u ptr
指针的足够大的容器需要几秒钟,因为每个引用计数器都需要原子递减。

可能这是因为侵入式容器已经在内部管理内存(如boost
ptr\ucode>容器),他们没有创建两个不同的instrusive容器实现(一个用于非拥有的指针,一个用于拥有的指针),而是决定对可以使用的点的类型进行限制。

可能有一个线索,即在默认配置下,
slist
存储为循环列表,这就排除了使用
共享的\u ptr
/
侵入式的\u ptr
和朋友,因为你会有一个参考周期


boost的一部分与另一部分不能正常工作,这仍然令人恼火;我想唯一的解决办法是使用类似于
侵入式的\u ptr
的方法,在向容器添加对象时手动增加引用计数,在移除对象时减少引用计数。(这排除了
shared\u ptr
,因为您不能直接调整其引用计数。)

我提到的侵入式\u ptr没有这个问题。而且这并不能真正回答问题,这就是为什么文档中说你不能这么做。这与这是否是个好主意不同。正如我在问题中所说的,他们不在内部管理内存。您必须自己分配和释放进入入侵容器的项目。从容器中添加/删除项不会执行分配/释放和复制。