intrusive_ptr

头文件: "boost/intrusive_ptr.hpp"

intrusive_ptrshared_ptr的插入式版本。有时我们必须使用插入式的引用计数智能指针。典型的情况是对于那些已经写好了内部引用计数器的代码,而我们又没有时间去重写它(或者已经不能获得那些代码了)。另一种情况是要求智能指针的大小必须与裸指针大小严格相等,或者shared_ptr的引用计数器分配严重影响了程序的性能(我可以肯定这是非常罕见的情况!)。从功能的观点来看,唯一需要插入式智能指针的情况是,被指类的某个成员函数需要返回this,以便它可以用于另一个智能指针(事实上,也有办法使用非插入式智能指针来解决这个问题,正如我们在本章前面看到的)。intrusive_ptr 不同于其它智能指针,因为它要求你来提供它所要的引用计数器。

intrusive_ptr 递增或递减一个非空指针上的引用计数时,它是通过分别调用函数 intrusive_ptr_add_refintrusive_ptr_release来完成的。这两个函数负责确保引用计数的正确性,并且负责在引用计数降为零时删除指针。因此,你必须为你的类重载这两个函数,正如我们后面将看到的。

使用intrusive_ptr与使用shared_ptr相比,有两个主要的不同之处。第一个是你需要提供引用计数的机制。第二个是把this当成智能指针是合法的[12],正如我们即将看到的,有时候这样很方便。注意,在多数情况下,应该使用非插入式的 shared_ptr.

在多数情况下,你不应该使用 boost::intrusive_ptr, 因为共享所有权的功能已在 boost::shared_ptr中提供,而且非插入式智能指针比插入式智能指针更灵活。但是,有时候也会需要插入式的引用计数,可能是由于旧的代码,或者是为了与第三方的类进行集成。当有这种需要时,可以用 intrusive_ptr ,它具有与其它Boost智能指针相同的语义。如果你使用过其它的Boost智能指针,你就会发现不论是否插入式的,所有智能指针都有一致的接口。使用intrusive_ptr的类必须可以提供引用计数。ntrusive_ptr 通过调用两个函数,intrusive_ptr_add_refintrusive_ptr_release来管理引用计数;这两个函数必须正确地操作插入式的引用计数,以保证 intrusive_ptr正确工作。在使用intrusive_ptr的类中已经内置有引用计数的情况下,实现对intrusive_ptr的支持就是实现这两个函数。有些情况下,可以创建这两个函数的参数化版本,然后对所有带插入式引用计数的类型使用相同的实现。多数时候,声明这两个函数的最好的地方就是它们所支持的类型所在的名字空间。

在以下情况时使用 intrusive_ptr

  • 你需要把 this 当作智能指针来使用。

  • 已有代码使用或提供了插入式的引用计数。

  • 智能指针的大小必须与裸指针的大小相等。

intrusive_ptr相关推荐

  1. boost智能指针之shared_ptr,scoped_ptr,intrusive_ptr,weak_ptr源码简析

    boost库实现了各种智能指针,基本上都纳入了c++11标准中,boost库的smart_ptr目录下就是各种指针的实现了: 1.shared_ptr template<class T> ...

  2. boost::interprocess::intrusive_ptr用法的测试程序

    boost::interprocess::intrusive_ptr用法的测试程序 实现功能 C++实现代码 实现功能 boost::interprocess::intrusive_ptr用法的测试程 ...

  3. 【Boost】boost库中智能指针——intrusive_ptr

    boost::intrusive_ptr一种"侵入式"的引用计数指针,它实际并不提供引用计数功能,而是要求被存储的对象自己实现引用计数功能,并提供intrusive_ptr_add ...

  4. intrusive_ptr源码分析

    intrusive_ptr是一个侵入式的引用计数型智能指针,它可以用于以下两种情形: 对内存占用要求非常严格,要求必须与原始指针一样 现存代码已经有了引用计数机制管理的对象 boost库不推荐使用in ...

  5. boost::intrusive_ptr的用法

    boost::intrusive_ptr和shared_ptr的区别 shared_ptr最大的陷阱就是用同一个裸指针创建了多个shared_ptr,这会导致这些shared_ptr析构时,因为每个s ...

  6. C++智能指针之——boost::intrusive_ptr<T>的内部实现

    1.概述 intrusive_ptr类模板存储了一个指向一个引用计数的对象的指针.每一个 intrusive_ptr 实例都会通过对函数 intrusive_ptr_add_ref 的调用来增加引用计 ...

  7. Boost中intrusive_ptr使用案例

    intrusive_ptr使用案例 1 简介Boost::intrusive_ptr 2 Demo1 3 Demo 2 4 内部部分API简要的实现 5 有何作用? 1 简介Boost::intrus ...

  8. C++ boost库智能指针(四):intrusive_ptr

    intrusive_ptr这个智能指针不怎么好用,虽然它和shared_ptr也是基于引用计数的,但需要自己来实现引用计数的增加与减少.需要在我们管理的指针对象中添加一个计数的成员,例如下面的类Tes ...

  9. C++智指针之——boost::intrusive_ptr,一种与shared_ptr、unique_ptr截然不同的智能指针

    智能指针boost::shared_ptr/std::shared_ptr使用了和数据无关的引用计数,在使用shared_ptr之前,必须要搞清楚资源的所有权和资源的使用权这两个问题(详见<C+ ...

  10. Boost库基础-智能指针(intrusive_ptr)

    intrusive_ptr intrusive_ptr是一种引用计数型智能指针,与之前介绍的scoped_ptr.shared_ptr不同,需要额外增加一些的代码才能使用. 如果现存代码已经有了引用计 ...

最新文章

  1. 【每日一算法】杨辉三角到底是什么?
  2. 一种小型后台管理系统通用开发框架中的Cache缓存设计
  3. eclipse修改代码后都需要clean的解决办法
  4. [转载]关于JAVA中子类和父类的构造方法
  5. 求只有2,3,5组成的第n小个数字
  6. cmenu 隐藏子项中的一个子项_QML中的模型-视图-代理
  7. 使用postman请求响应Invalid CORS request
  8. maven之阿里云Maven镜像的使用
  9. 大咖说中台 | 建设数据中台系列(五)——中台架构详解(下)
  10. C++ STL string的构造函数
  11. 60多年来计算机是根据什么的发展,计算机复习题98197.doc
  12. 薄荷Android团队招聘啦
  13. R语言ETL工程:插入与合并(add/bind)
  14. 机器人学基础——坐标
  15. excel index 函数
  16. 无人机协同搜索matlab,一种多无人机协同目标搜索方法与流程
  17. 华为手机Android studio 配置ADB wifi 调试
  18. stm32F103+EncEthernet+ENC28J60驱动+ping
  19. 【Android Gradle 插件】 Splits 配置 ① ( BaseExtension#splits 配置 | Splits 配置简介 )
  20. 【网络学习】LSTM 长期依赖(Long-Term Dependencies)问题

热门文章

  1. Javascript判断Maxthon浏览器
  2. GBA反汇编(烈火之剑中文版查找字库)
  3. Stm32 烧写出现Contents mismatch at: 0800D03AH (Flash=FFH Required=C2H) !
  4. 蓝牙计算机操作与设置在哪里,ThinkPad蓝牙的设置方法步骤
  5. 开源H5盲盒商城源码系统4.0|vue+TP5php框架开发开源网站+安装教程
  6. Java 实现国际象棋 可视化 代码
  7. 二:OpenCV图片叠加逻辑运算
  8. 超简单的图片去水印方法,看完就会!
  9. 连续字母长度 给定一个字符串 只包含大写字母
  10. C 使用fread读取文件