c ++ 11中的intrusive_ptr

Aar*_*kan 33 c++ boost smart-pointers shared-ptr c++11

C++ 11有相同的东西boost::intrusive_ptr吗?

我的问题是我的C++代码有一个C风格的界面.接口的两端都可以使用C++,但出于兼容性原因需要公开C接口.我无法使用,std::shared_ptr因为我必须通过两个(或更多)智能指针来管理对象.我无法找到类似的解决方案boost::intrusive_ptr.

Jon*_*ely 41

c ++ 11是否有类似boost :: intrusive_ptr的东西?

没有.

它确实有std::make_shared这意味着std::shared_ptr几乎(参见下面的注释)一样有效侵入式智能指针,这是因为参考计数将被存储在相邻存储器对象本身,提高的参考和高速缓存使用局部性.它还提供了std::enable_shared_from_this允许您std::shared_ptr在只有一个指向a拥有的对象的内置指针时检索的情况shared_ptr,但是不允许您使用不同的智能指针类型来管理对象.

shared_ptr期望完全负责管理对象.一个不同的智能指针类型可能只管理"强"引用计数而不是"弱"引用计数,这将允许计数不同步并打破不变量shared_ptr.


注意:使用make_shared允许shared_ptr几乎为侵入指针有效.当使用时,对象和引用计数信息可以分配在单个内存块中make_shared,但是仍然会有两个引用计数(对于"强"和"弱"计数),这不是侵入式指针的情况.他们不支持weak_ptr.此外,shared_ptr对象本身总是必须存储两个指针(将返回的shared_ptr::get()指针和指向包含引用计数的"控制块"的另一个指针,并且知道拥有对象的动态类型)因此具有比侵入式指针.

  • _intrusive指针不支持weak_ptr_ - 澄清:侵入式指针不能通过设计支持(线程安全)weak_ptr.refcount需要存储在对象之外,否则对弱指针的任何锁定尝试都会随着对象的破坏而竞争.换句话说:每个弱指针都在refcount上拥有共享所有权.因此,如果refcounter与对象本身不可分割(就像使用侵入式指针一样),弱指针因此也对对象本身具有(强)共享所有权,这与弱指针的概念相矛盾. (9认同)
  • @ComicSansMS它不仅仅是线程的问题:弱指针无法检查对象是否仍然存活,因为如果它已经被破坏,它们就会读取`free`d memory (3认同)
  • `shared_ptr`违反了"你不为你不使用的东西买单"的原则.它存储至少两个计数器和一个删除器(总共至少四个字?),加上每个`shared_ptr`的大小是两个单词而不是一个.这对于具有小节点的链接结构来说是非常重要的,其中不需要弱引用.(想想绳子的实施) (2认同)
  • @ybungalobill“您不用为不使用的东西付钱”并不适合为工作选择错误的工具。如果您不需要共享所有权,请不要使用shared_ptr。 (2认同)