以下三种智能指针均为类模板

1.shared_ptr  共享指针   ,多个指针指向同一个对象,最后一个指针被销毁时,这个对象会被释放。

2.week_ptr 是辅助shared_ptr工作的

3.unique_ptr 是独占式指针,同一时间只能有一个指针能指向该对象,该对象所有权还是可以转移出去的。

shared_ptr基础

1.共享所有权,不是被一个shaerd_ptr使用,而是被多个shared_ptr之间相互协作,shared_ptr有额外开销。

2.工作原理:采用引用计数机制,每个shared_ptr的拷贝都指向相同的内存,所以,只有最后一个指向该内存(对象)的shared_ptr指针不需要再指向对象时,那么shared_ptr才会去析构指向的对象。

3.最后一个指向该内存对象的shared_ptr在什么情况下会释放该对象?

a.shared_ptr被析构的时候。

b.这个shared_ptr指向其他对象时。

4.格式:shared_ptr<指向的类型>智能指针的名字

 //智能指针p1指向new一个int类型的对象,初始值为100shared_ptr<int>p1(new int(100));

其中引用计数为1,该指针是一个强引用。

5.返回值为shared_ptr

shared_ptr<int>makes(int val)
{return shared_ptr<int>(new int(val));
}

6.裸指针可以初始化智能指针,但是不推荐。

7.shared_ptr<int>p; 指向int的智能指针,名字为p,但目前指向的为空nullptr。'

8.make_shared函数,标准库里的函数模板,安全高效的分配和使用shared_ptr;它能在内存(堆)中分配并初始化一个对象,然后返回指向对象的shared_ptr。

shared_ptr<int>p1=make_shared<int>(100);

9. 把智能指针当作实参向函数里传递时,引用计数+1,出函数后引用计数-1。如果传递使用引用&,引用计数不会增加,如果有指针来接返回值,引用计数会增加。

10.use_count( )返回多少个智能指针指向某个对象,主要用于调试目的。

 int i = 0;shared_ptr<int>p1=make_shared<int>(100);i = p1.use_count();//引用计数为1auto p2(p1);//引用计数+1i = p1.use_count();//引用计数为2

11.unique( ) :是否该智能指针独占某个指向的对象,也就是若只有一个智能指针指向某个对象,则unique( )返回true,否则返回false。

12.reset( )复位(恢复)

a.reset( )不带参数时,若智能指针P是唯一指向该对象的指针,则释放,并置空。若智能指针P不是唯一指向该对象的指针,则引用计数减少1,同时将P置空。

 shared_ptr<int>p1=make_shared<int>(100);p1.reset();

b.reset( )带参数时,若智能指针P是唯一指向对象的指针,则释放并指向新的对象。若P不是唯一的指针,则只减少引用计数,并指向新的对象。

 shared_ptr<int>p1=make_shared<int>(100);p1.reset(new int (200));

13.get( )返回智能指针中保存的指针(裸指针),delete get出的指针,系统会报告异常。

14.swap( ) 交换两个智能指针指向的对象。

15.shared_ptr<A[ ]>P(new A[10]) 此定义系统可以自动释放。

week_ptr

1.weak_ptr是辅助shared_ptr工作,(强shared,弱weak)。

2.它是一个类模板,也是一个智能指针,这个智能指针指向一个shared_ptr管理的对象,但是weak_ptr这中指针不控制生命周期。(不会改变引用计数)

3.作用:监视shared_ptr的生命周期,是强引用的扩充(不是独立的智能指针)。weak_ptr能够监视到它的指向对象是否存在。

4.weak_ptr的创建,创建weak_ptr的时候,一般是用一个shared_ptr来初始化。强引用计数不会改变,而弱引用计数会改变。

 shared_ptr<int>p1=make_shared<int>(100);weak_ptr<int>p2(p1);//P2共享P1,强引用计数不会改变

5.lock( )  是检查weak_ptr所指向的对象是否存在,如果存在,这个lock返回一个指向shared_ptr,如果不存在则返回一个空的shared_ptr。存在(强引用计数+1)

6.use_count( )获取与弱指针共享对象的其他shared_ptr数量。

7.expired( )是否过期的意思,若该指针的use_count( )为0,表示该弱指针指向的对象已经不存在,则返回true,用这个函数判断所观察的资源是否释放。

8.reset( )将该指弱指针设置为空,不影响指向该对象的强引用数量,但指向该对象的弱引用计数会减少。

9.weak_ptr 和 shared_ptr是裸指针的2倍。

unique_ptr

1.同一时刻,只能有一个unique_ptr指针指向这个对象内存。

2.make_unique函数初始化并返回一个unique_ptr。

3.move移动语义,移动完后,p1为空,p2指向原p1所指。

 unique_ptr<string>p1(new string("hello"));unique_ptr<string>p2 = std::move(p1);

4.release( )  放弃对指针的控制权,切断指针与指针对象之间的联系,返回裸指针。将智能指针(置空),裸指针可手动delete,也可初始化另一个智能指针,或给另一个智能指针赋值。

5.转成shared_ptr,如果unique_ptr为右值,就可以将它赋值给shared_ptr。因为shared_ptr包含一个显示构造函数,可适用于将右值unique_ptr转换为shared_ptr,shared_ptr接管unique_ptr指向的内存对象。

C++ 11 深度学习(六)智能指针综述相关推荐

  1. 基于深度学习的智能车辆视觉里程计技术发展综述*--陈涛

    [1]陈涛, 范林坤, 李旭川,等. 基于深度学习的智能车辆视觉里程计技术发展综述[J]. 汽车技术, 2021(1):10. 本文内容: 介绍了基于模型的里程计研究现状 对比了常用智能车数据集, 将 ...

  2. 基于深度学习的知识图谱综述

    基于深度学习的知识图谱综述 摘要:随着现如今计算机设备的更新,计算能力的不断提高促使深度学习再一度推上热门技术,深度学习已经广泛应用于图像处理.文本挖掘.自然语言处理等方面,在医学.交通.教育.旅游等 ...

  3. 深度学习文本分类文献综述(翻译自Deep Learning Based Text Classification: A Comprehensive Review)

    深度学习文本分类文献综述 摘要 介绍 1. 文本分类任务 2.文本分类中的深度模型 2.1 Feed-Forward Neural Networks 2.2 RNN-Based Models 2.3 ...

  4. 三维重建 几何方法 深度学习_三维重建算法综述|传统+深度学习方式

    作者:CJB Date:2020-2-21 来源:基于深度学习的三维重建算法综述 欢迎加入国内最大的3D视觉交流社区,1700+的领域从业者正在共同进步~ 00 前言 01 基于传统多视图几何的三维重 ...

  5. 论文阅读_基于深度学习的异常检测综述

    英文题目:Deep Learning for Anomaly Detection: A Review 中文题目:基于深度学习的异常检测综述 论文地址:https://arxiv.org/pdf/200 ...

  6. 基于深度学习的智能问答

    摘要: 纵观自动问答系统的技术发展历史,从1950年代因图灵测试而诞生至今,已经有几十年的历史.但真正在产业界得到大家的广泛关注,则得益于2011年Siri和Watson成功所带来的示范效应.自此,自 ...

  7. 从贝叶斯计算、深度学习、智能投顾看人工智能与区块链技术

    人工智能与区块链技术研讨会西安站"9 日在西安电子科技大学举行.这是继北京站顺利举办之后,人工智能与区块链技术研讨会全球巡回的第二站.包括西安电子科技大学通院电子实验室主任刘乃东.清华大学软 ...

  8. 【西安交大】2020年最新深度学习目标检测方法综述

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 目标检测的任务是从图像中精确且高效地识别.定位出大量预定义类别的物体实例.随着深度 ...

  9. 基于深度学习的脑电图识别 综述篇(三)模型分析

    作者|Memory逆光 本文由作者授权分享 导读 脑电图(EEG)是一个复杂的信号,一个医生可能需要几年的训练并利用先进的信号处理和特征提取方法,才能正确解释其含义.而如今机器学习和深度学习的发展,大 ...

  10. 基于深度学习的脑电图识别 综述篇(二)数据采样及处理

    作者|Memory逆光 本文由作者授权分享 导读 脑电图(EEG)是一个复杂的信号,一个医生可能需要几年的训练并利用先进的信号处理和特征提取方法,才能正确解释其含义.而如今机器学习和深度学习的发展,大 ...

最新文章

  1. 报名开启 | 神策 2019 数据驱动大会「矩·变」等你!
  2. Buffer Pool--内存总结1
  3. .net连接mysql数据_.net连接MYSQL数据库 转载
  4. Vue使用axios,设置axios请求格式为form-data
  5. java短除法获取二进制_Java十四天零基础入门-Java的数据类型介绍
  6. 【Tyvj1185】【codevs1296】【BZOJ1588】营业额统计,Splay练习
  7. linux cp 强行覆盖
  8. android中函数的直接使用用import就可以了吗各种类不用创建对象吗_React Hooks 如何安全地使用state...
  9. 导入其他用户的EFS证书
  10. java集合框架的选用 若是数据量很大,0421测试题
  11. 估计、偏差 、方差
  12. DVD to MP4视频格式转换器v3.1.0 中文版
  13. 怎样用阿里云搭建个人博客
  14. ABP AOP 用例
  15. 个税计算--Java
  16. 高德地图交通态势爬取
  17. C#常见错误—未将对象引用设置到对象的实例
  18. 关于HBC路由器设置端口映射
  19. 数字化转型:核心架构、重要价值及实现路径
  20. Android 通过appt.exe获取已安装apk的版本信息

热门文章

  1. 从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存
  2. vue 动态组件组件复用_真正的动态声明性组件
  3. orika 映射非空字段_Orika:将JAXB对象映射到业务/域对象
  4. 无服务器安全性:将其置于自动驾驶仪上
  5. .net2.0 orm_Hibernate 4.3 ORM工具
  6. @ParameterizedTest在@CvsSource中具有空值
  7. 使用RxNetty访问Meetup的流API
  8. 具有Overlord的WildFly 8.1中的API管理
  9. JDBC布尔兼容性列表
  10. 为什么REST如此重要