c ++ 11中的intrusive_ptr

时间:2012-12-17 10:24:24

标签: c++ c++11 boost shared-ptr smart-pointers

C ++ 11是否具有与boost::intrusive_ptr等效的内容?

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

1 个答案:

答案 0 :(得分:39)

  

c ++ 11是否具有与boost :: intrusive_ptr等效的东西?

没有

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

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


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