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

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

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指向的内存对象。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10 NAT网络地址转换

广域网技术 上面聊的内容都是内网的一些配置&#xff0c;但内网终将要访问外网的&#xff0c;我们需要怎么处理呢&#xff1f;一般使用HDLC&#xff08;高级数据链路控制协议&#xff09;或者PPP&#xff08;点对点协议&#xff09;。 使用PPP安全接入Internet PPP&#xff0…

java应用性能指标_性能与可靠性:Java应用为何像F1汽车

java应用性能指标再想一想。 性能和可靠性相关吗&#xff1f; 还是这些东西相互排斥&#xff1f; 我认为是后者。 如今&#xff0c;现实是IT部门将应用程序的性能和可靠性视为同一事物&#xff0c;但这离事实还差得远。 让我们看看一级方程式车队如何管理性能和可靠性。 上赛…

tomcat ajp协议安全限制绕过漏洞_Apache Tomcat文件包含漏洞(CVE20201938)复现

一、漏洞背景2020年02月20日&#xff0c;国家信息安全漏洞共享平台(CNVD)发布了关于Apache Tomcat文件包含漏洞(CVE-2020-1938/CNVD-2020-10487)的安全公告。Tomcat作为一款免费开源轻量级的web应用服务器&#xff0c;广泛应用于并发量不是很高的场合&#xff0c;Tomact默认端口…

【H.264/AVC视频编解码技术】第三章【熵编码】

熵编码的概念 熵&#xff1a;化学与热力学概念&#xff0c;用于度量能量退化的指标。熵越高&#xff0c;物体/系统做工能力越低。 信息学中的熵&#xff1a;用于度量消息的平均信息量&#xff0c;和信息的不确定性。越是随机的&#xff0c;前后不相关的信息&#xff0c;其熵越…

mock 抛出一个异常如何终止_教你使用Mock完成单元测试

更多精彩文章请关注本人微信公众号1、什么是Mock?mock是在测试过程中&#xff0c;对于一些不容易构造/获取的对象&#xff0c;创建一个mock对象来模拟对象的行为。比如说你需要调用B服务&#xff0c;可是B服务还没有开发完成&#xff0c;那么你就可以将调用B服务的那部分给Moc…

jconsole查看连接数_在JConsole和VisualVM中查看DiagnosticCommandMBean

jconsole查看连接数我已经将JConsole用作合适的通用JMX客户端已有很多年了。 该工具通常随Oracle JDK一起提供&#xff0c;并且易于使用。 在JMX交互方面&#xff0c;JConsole优于VisualVM的最大优点是JConsole带有内置的MBeans选项卡&#xff0c;而必须为VisualVM中的相同功能…

如何知道一个域名是否存在_域名检测API实现查看一个域名在微信中是否被封

针对微信转发分享链接过程中&#xff0c;您宝贵的域名被微信检测系统过滤拦截而无法正常浏览&#xff0c;例如该网页包含诱导分享内容&#xff0c;被多人投诉等&#xff0c;又例如提示该网页已停止访问等提示。怎么查询域名在微信中是否被封了呢?以上接口可检测到域名的四种异…

量化指标公式源码_通达信指标公式源码线上阴线指标公式

工作线:(EMA(C,14)),POINTDOT,LINETHICK3,COLOR22ACDE;生命线:(MA(C,25)),LINETHICK1,COLORMAGENTA;不惑线:(MA(C,40)),COLORCYAN,LINETHICK1;姊妹线:(EMA(C,56)),POINTDOT,COLOR33CCDD,LINETHICK1;A3:EMA((((SLOPE(C,21)) * 20) C),68);A4:EMA(C,10);A5:REF(C,2);A6:((SMA((M…

jsf和jsp_带有JSF,Servlet和CDI的DynamicReports和JasperReports

jsf和jsp在此示例中&#xff0c;我将展示如何将DynamicReport和JasperReports与Servlet和CDI集成。 工具&#xff1a; TIBCO Jaspersoft Studio-6.0.4。最终版 Eclipse Luna服务版本2&#xff08;4.4.2&#xff09;。 WildFly 8.x应用程序服务器。 这是Eclipse上项目层次结…

接口隔离原则_设计模式的三大分类及六大原则

设计模式(Design pattern)代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式分为三大类&…

Leetcode 24. 两两交换链表中的节点

原题链接 题解&#xff1a; 1.头部会改变创建虚拟头结点 2.前两个点定义为a,b&#xff0c;c 3.p指向b,a指向c,b指向a ; p指向本段最后一个结点。 class Solution { public:ListNode* swapPairs(ListNode* head) {auto dummy new ListNode(-1);dummy->next head;for (a…

python 获取文件名_真实需求 | Python+os+openpyxl 批量获取Excel的文件名和最大行数...

1. 提出需求 这已经不知道是粉丝问我的第几个办公自动化的问题了&#xff0c;并且这些问题都是大家在学习和工作中碰到过的真实问题场景。其实从下图中已经可以很明确的看出别人的需求了&#xff0c;我这里就不用在赘述了&#xff0c;下面直接上思路吧&#xff01;2. 解题思路为…

apache ignite_从In Memory Data Grid,Apache Ignite快速入门

apache igniteIMDG或内存数据网格不是内存中关系数据库&#xff0c;NOSQL数据库或关系数据库。 它是另一种软件数据存储库。 数据模型分布在单个位置或多个位置的许多服务器上。 这种分布称为数据结构。 这种分布式模型被称为“无共享”架构。 IMDG具有以下特征&#xff1a; 所…

bvp解算器是什么_那些学习了编程的中学生,为什么会更可能成功?

来源 | 异步当你看到这个题目&#xff0c;或许会想&#xff0c;这不是搞笑吗&#xff1f;众所周知&#xff0c;高等数学是编程的基础和前提&#xff0c;而说起程序编写员&#xff0c;在普通人眼里就是数学学霸的代名词&#xff0c;人们往往会把它和那些数学天才的名字联系在一起…

maven与spring_与Spring和Maven签约首个SOAP服务

maven与spring1.简介 在本教程中&#xff0c;我们将学习使用JAX-WS&#xff0c;Spring和Maven实施合同优先的SOAP服务应用程序。 这是使用合同优先还是代码优先方法的更多设计决定。 在开发基于SOAP的Web服务应用程序时使用应用合同优先的方法最显着的好处是&#xff0c;可以在…

如何维持手机电池寿命_充电小知识:你知道如何正确充电吗?这几种充电方式最损害电池...

目前基本上大部分人都至少有一部智能手机&#xff0c;智能手机基本上都需要每日一充&#xff0c;你的充电方式会不会损伤电池呢&#xff1f;有部分消费者认为要等到手机电量耗尽后再充电&#xff0c;还有人认为手机充电要充至100%才能拔下来&#xff0c;有人觉得充电宝等产品给…

【开放集检测】OpenGAN: Open-Set Recognition via Open Data Generation 论文阅读

文章目录 英语积累为什么使用GAN系列网络进行开放集检测摘要1. 前言2. 相关工作开集检测基于GAN网络的开集检测基于暴露异常数据的开集检测 3. OpenGAN3.1 公式建模3.1.1 二分类方法存在问题如何解决 3.1.2 使用合成数据存在问题如何解决 3.1.3 OpenGAN3.1.4 模型验证 3.2 先前…

sso集成shiro_Keycloak SSO集成到jBPM和Drools Workbench中

sso集成shiro介绍 单一登录&#xff08;SSO&#xff09;和相关令牌交换机制正在成为Web上不同环境中身份验证和授权的最常见方案&#xff0c;尤其是在迁移到云中时。 本文讨论了Keycloak与jBPM或Drools应用程序的集成&#xff0c;以便使用Keycloak上提供的所有功能。 Keycloak…

jbpm 和 drools_jBPM和Drools工作台中的用户和组管理

jbpm 和 drools介绍 本文讨论了一项新功能&#xff0c;该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装&#xff0c;设置和使用此功能之前&#xff0c;本文讨论了一些以前的概念&#xff0c;需要进一步理…

从事java编程技能要求_5道Java视频课程,提高您的编程技能

从事java编程技能要求作为Web开发人员&#xff0c;跟上技术知识可能会很棘手。 新技术似乎每天都在弹出&#xff0c;而基本技术也看到了重复迭代的浪潮&#xff0c;增加了新的功能。 Java开发人员应该做什么&#xff1f; 这是在线教育平台发挥作用的地方。 它们可以帮助您快速…