《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针

上传人:小萌新****ao 文档编号:367856680 上传时间:2023-11-15 格式:PPT 页数:29 大小:1.20MB
返回 下载 相关 举报
《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针_第1页
第1页 / 共29页
《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针_第2页
第2页 / 共29页
《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针_第3页
第3页 / 共29页
《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针_第4页
第4页 / 共29页
《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针》由会员分享,可在线阅读,更多相关《《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针(29页珍藏版)》请在金锄头文库上搜索。

1、2023/11/121 学习要点学习要点shared_ptrunique_ptrweak_ptr第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/122 学习目标学习目标第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针了解三种智能指针shared_ptr、unique_ptr和weak_ptr2023/11/123shared_ptr:是一个模板类,定义在是一个模板类,定义在头文件里。头文件里。shared_ptr对象会在其作用域结束时,自动销毁,对象会在其作用域结束时,自动销毁,如果该如果该shared_ptr是指向某动态对象是指向某动态对象

2、a的最后一个的最后一个shared_ptr,那么,那么a所在的内存会被释放。所在的内存会被释放。第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/124unique_ptr:也是一个模板类,同样定义在也是一个模板类,同样定义在头文件头文件里。与里。与shared_ptr不同的是,不同的是,unique_ptr是自己是自己“拥有拥有”一个指向的对象,也就是说不允许有两个或一个指向的对象,也就是说不允许有两个或者以上的者以上的unique_ptr指向同一个对象。在一个指向同一个对象。在一个unique_ptr对象的作用域结束时,对象的作用域结束时,unique_pt

3、r指向指向的对象的内存被释放。为了保证的对象的内存被释放。为了保证unique_ptr对对象对对象的独有性,赋值、复制操作是不允许的。但有一个的独有性,赋值、复制操作是不允许的。但有一个例外,可以在函数中例外,可以在函数中return一个一个unique_ptr。第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/125weak_ptr:同样也是一个模板类,定义在同样也是一个模板类,定义在 头文件头文件中。它是为了辅助中。它是为了辅助shared_ptr而引入的一种智能指而引入的一种智能指针,它是一种弱引用,指向针,它是一种弱引用,指向shared_ptr所管理的

4、对所管理的对象,但不增加象,但不增加shared_ptr的引用计数。它存在的意的引用计数。它存在的意义就是协助义就是协助shared_ptr更好的完成工作,可以把它更好的完成工作,可以把它比做成一个秘书或助理。比做成一个秘书或助理。第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/126第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针shared_ptr sp空智能指针,可以指向类型为空智能指针,可以指向类型为T的对象的对象unique_ptr upp将将p作为一个判断条件,若作为一个判断条件,若p指向一个指向一个对象,则为对象,则为true*

5、p解引用解引用p,获得它指向的对象,获得它指向的对象p-mem等价于等价于(*p).memp.get()返回返回p中保存的指针中保存的指针swap(p,q)交换交换p和和q中的指针中的指针p.swap(q)表表3-2 shared_ptr3-2 shared_ptr和和unique_ptrunique_ptr都支持的操作都支持的操作2023/11/127第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针make_shared(args)返回一个返回一个shared_ptr,指向一个动态分配,指向一个动态分配的类型为的类型为T的对象。使用的对象。使用args初始化此对初始化此对象

6、象shared_ptrp(q)p是是shared_ptr q的拷贝,此操作会递增的拷贝,此操作会递增q中的计数器,中的计数器,q中的指针必须能转换为中的指针必须能转换为T*p=qp和和q都是都是shared_ptr,所保存的指针必须,所保存的指针必须能相互转换,此操作会递减能相互转换,此操作会递减p的引用计数,的引用计数,递增递增q的引用计数,若的引用计数,若p的引用计数变为的引用计数变为0,则将其管理的原内存释放。,则将其管理的原内存释放。p.unique()若若p.use_count()为为1,返回,返回true,否则返,否则返回回falsep.use_count()返回与返回与p共享对象

7、的智能指针数量,可能共享对象的智能指针数量,可能很慢,主要用于调试很慢,主要用于调试表表3-3 shared_ptr3-3 shared_ptr独有的操作独有的操作2023/11/1281、shared_ptr:/指向指向string类型的空指针,默认初始化的智能指针是一个空类型的空指针,默认初始化的智能指针是一个空指针指针shared_ptr p1;shared_ptr p2;/指向指向int类型的空指针类型的空指针/指向一个值为指向一个值为10的的int类型的指针类型的指针shared_ptr p3(new int(10);第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针

8、2023/11/1291、shared_ptr:/错误:不能将一个内置指针直接赋值给一个智能指针错误:不能将一个内置指针直接赋值给一个智能指针shared_ptr p4=new int(1);/p5为指向一个值为为指向一个值为1的的int类型的类型的shared_ptrshared_ptr p5=make_shared(1);第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/12101、shared_ptr:/p6为指向一个值为为指向一个值为9999999999的的string类型的类型的shared_ptrshared_ptr p6=make_shared(1

9、0,9);/p7指向一个值初始化的指向一个值初始化的int,即,值为,即,值为0shared_ptr p7=make_shared();第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/12111、shared_ptr:shared_ptr的复制和赋值:当进行复制或赋值操作的复制和赋值:当进行复制或赋值操作时,时,每个每个shared_ptr都会记录有多少个其他都会记录有多少个其他shared_ptr指向相同的对象。指向相同的对象。/p指向的对象只有指向的对象只有p一个引用者一个引用者auto p=make_shared(1);/p和和q指向相同对象,此对象有两

10、个引用者指向相同对象,此对象有两个引用者auto q(p);第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/1212第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针1、shared_ptrv每个每个shared_ptr都有一个关联的计数器,通常称其都有一个关联的计数器,通常称其为引用计数为引用计数。v无论何时无论何时复制复制一个一个shared_ptr,计数器都会递增。,计数器都会递增。v当给当给shared_ptr赋予一个新值,或者是赋予一个新值,或者是shared_ptr被销毁(比如一个被销毁(比如一个shared_ptr离开其作用域)时

11、,计离开其作用域)时,计数器就会递减。数器就会递减。v一旦一个一旦一个shared_ptr的计数器变为的计数器变为0,它就会自动释,它就会自动释放所管理的对象放所管理的对象:2023/11/1213第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针使用使用shared_ptr注意事项:注意事项:(1)不要混合使用普通指针和)不要混合使用普通指针和shared_ptr指针指针(2)不要使用)不要使用get初始化另一个初始化另一个shared_ptr指针或为指针或为shared_ptr指针赋值指针赋值:2023/11/1214第第3章章 类和对象类和对象-动态内存与智能指针动态内存

12、与智能指针表表3-4 3-4 定义和改变定义和改变shared_ptrshared_ptr的其他方法的其他方法shared_ptrp(q)p管理内置指针q所指向的对象,q必须指向new分配的内存,且能转换为T*类型shared_ptrp(u)p从unique_ptru那里接管了对象的所有权,将u置为空shared_ptrp(q,d)p接管了内置指针q所指向的对象的所有权,q必须能转换为T*类型,p将使用可调用对象d来代替deleteshared_ptrp(p2,d)p是shared_ptrp2的拷贝,唯一的区别是p将用可调用对象d来代替deletep.reset()当智能指针中有值的时候,调用

13、reset()会使引用计数减1。如果发现此时p的引用计数为0时,则reset会释放p对象。p.reset(q)p.reset(q,d)若传递了可选参数内置指针q,会将p的引用计数减1(当然,如果发现引用计数为0时,则自动释放p所管理的对象),然后令p指向q。若还传递了参数d,将会调用d而不是delete来释放q。2023/11/1215第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针为了正确使用智能指针,必须坚持以下基本规范:为了正确使用智能指针,必须坚持以下基本规范:(1)不使用相同的内置指针值初始化(或)不使用相同的内置指针值初始化(或reset)多)多个个shared_

14、ptr,原因在于,会造成二次销毁。,原因在于,会造成二次销毁。int*p8=new int;shared_ptr p9(p8);shared_ptr p10(p8);/逻辑错误逻辑错误(2)不)不delete get()返回的指针。返回的指针。(3)如果使用)如果使用get()返回的指针,记住当最后一个对返回的指针,记住当最后一个对应的智能指针销毁后,该指针就变为无效了。应的智能指针销毁后,该指针就变为无效了。:2023/11/1216第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针为了正确使用智能指针,必须坚持以下基本规范:为了正确使用智能指针,必须坚持以下基本规范:(4)

15、默认情况下,一个用来初始化智能指针的普通指)默认情况下,一个用来初始化智能指针的普通指针必须指向动态内存,因为智能指针默认使用针必须指向动态内存,因为智能指针默认使用delete来释放它所关联的对象。也可以把智能指针绑定到其来释放它所关联的对象。也可以把智能指针绑定到其他类型的指针上,但是我们必须提供自己的删除操作他类型的指针上,但是我们必须提供自己的删除操作来替代来替代delete。(5)避免循环引用。智能指针最大的一个陷阱是循环)避免循环引用。智能指针最大的一个陷阱是循环引用,循环引用会导致内存泄漏。解决方法是改用引用,循环引用会导致内存泄漏。解决方法是改用weak_ptr。见下面的例。见

16、下面的例3-16。:2023/11/12172、unique_ptrv一个一个unique_ptr“拥有拥有”它所指向的对象,与它所指向的对象,与shared_ptr不同,某个时刻只能有一个不同,某个时刻只能有一个unique_ptr指向指向一个给定的对象,一个给定的对象,unique_ptr被销毁时,其所指向的对被销毁时,其所指向的对象也被销毁了。象也被销毁了。v定义一个定义一个unique_ptr指针时,必须将其绑定到一个指针时,必须将其绑定到一个new返回的指针上。类似返回的指针上。类似shared_ptr,初始化,初始化unique_ptr必须采用直接初始化形式。必须采用直接初始化形式。/p1为指向一个为指向一个double类型的类型的unique_ptr unique_ptr p1;/p2为指向一个值为为指向一个值为10的的int类型的类型的unique_ptr unique_ptr p2(new int(10);第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/11/12182、unique_ptrv由于一个由于一个unique_ptr拥有它指向的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号