《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针.ppt
《《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针.ppt》由会员分享,可在线阅读,更多相关《《面向对象程序设计C++》课件1第3章 类和对象-动态内存与智能指针.ppt(29页珍藏版)》请在文库网上搜索。
1、2023/12/21 学习要点学习要点shared_ptrunique_ptrweak_ptr第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/22 学习目标学习目标第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针了解三种智能指针shared_ptr、unique_ptr和weak_ptr2023/12/23shared_ptr:是一个模板类,定义在是一个模板类,定义在头文件里。头文件里。shared_ptr对象会在其作用域结束时,自动销毁,对象会在其作用域结束时,自动销毁,如果该如果该shared_ptr是指向某动态对象是指向某动态对象a的最
2、后一个的最后一个shared_ptr,那么,那么a所在的内存会被释放。所在的内存会被释放。第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/24unique_ptr:也是一个模板类,同样定义在也是一个模板类,同样定义在头文件头文件里。与里。与shared_ptr不同的是,不同的是,unique_ptr是自己是自己“拥有拥有”一个指向的对象,也就是说不允许有两个或一个指向的对象,也就是说不允许有两个或者以上的者以上的unique_ptr指向同一个对象。在一个指向同一个对象。在一个unique_ptr对象的作用域结束时,对象的作用域结束时,unique_ptr指向指
3、向的对象的内存被释放。为了保证的对象的内存被释放。为了保证unique_ptr对对象对对象的独有性,赋值、复制操作是不允许的。但有一个的独有性,赋值、复制操作是不允许的。但有一个例外,可以在函数中例外,可以在函数中return一个一个unique_ptr。第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/25weak_ptr:同样也是一个模板类,定义在同样也是一个模板类,定义在 头文件头文件中。它是为了辅助中。它是为了辅助shared_ptr而引入的一种智能指而引入的一种智能指针,它是一种弱引用,指向针,它是一种弱引用,指向shared_ptr所管理的对所管理的
4、对象,但不增加象,但不增加shared_ptr的引用计数。它存在的意的引用计数。它存在的意义就是协助义就是协助shared_ptr更好的完成工作,可以把它更好的完成工作,可以把它比做成一个秘书或助理。比做成一个秘书或助理。第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/26第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针shared_ptr sp空智能指针,可以指向类型为空智能指针,可以指向类型为T的对象的对象unique_ptr upp将将p作为一个判断条件,若作为一个判断条件,若p指向一个指向一个对象,则为对象,则为true*p解引用解引
5、用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/12/27第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针make_shared(args)返回一个返回一个shared_ptr,指向一个动态分配,指向一个动态分配的类型为的类型为T的对象。使用的对象。使用args初始化此对初始化此对象象shared
6、_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/12/281、shared_ptr:/指向指向string类型的空指针,默认初始化的智能指针是一个空类型的空指针,默认初始化的智能指针是一个空指针指针shared_ptr p1;shared_ptr p2;/指向指向int类型的空指针类型的空指针/指向一个值为指向一个值为10的的int类型的指针类型的指针shared_ptr p3(new int(10);第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/
8、291、shared_ptr:/错误:不能将一个内置指针直接赋值给一个智能指针错误:不能将一个内置指针直接赋值给一个智能指针shared_ptr p4=new int(1);/p5为指向一个值为为指向一个值为1的的int类型的类型的shared_ptrshared_ptr p5=make_shared(1);第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/2101、shared_ptr:/p6为指向一个值为为指向一个值为9999999999的的string类型的类型的shared_ptrshared_ptr p6=make_shared(10,9);/p7指向
9、一个值初始化的指向一个值初始化的int,即,值为,即,值为0shared_ptr p7=make_shared();第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/2111、shared_ptr:shared_ptr的复制和赋值:当进行复制或赋值操作的复制和赋值:当进行复制或赋值操作时,时,每个每个shared_ptr都会记录有多少个其他都会记录有多少个其他shared_ptr指向相同的对象。指向相同的对象。/p指向的对象只有指向的对象只有p一个引用者一个引用者auto p=make_shared(1);/p和和q指向相同对象,此对象有两个引用者指向相同对象,
10、此对象有两个引用者auto q(p);第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针2023/12/212第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针1、shared_ptrv每个每个shared_ptr都有一个关联的计数器,通常称其都有一个关联的计数器,通常称其为引用计数为引用计数。v无论何时无论何时复制复制一个一个shared_ptr,计数器都会递增。,计数器都会递增。v当给当给shared_ptr赋予一个新值,或者是赋予一个新值,或者是shared_ptr被销毁(比如一个被销毁(比如一个shared_ptr离开其作用域)时,计离开其作用域)时,计
11、数器就会递减。数器就会递减。v一旦一个一旦一个shared_ptr的计数器变为的计数器变为0,它就会自动释,它就会自动释放所管理的对象放所管理的对象:2023/12/213第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针使用使用shared_ptr注意事项:注意事项:(1)不要混合使用普通指针和)不要混合使用普通指针和shared_ptr指针指针(2)不要使用)不要使用get初始化另一个初始化另一个shared_ptr指针或为指针或为shared_ptr指针赋值指针赋值:2023/12/214第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针表表3-4 3-4
12、 定义和改变定义和改变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()当智能指针中有值的时候,调用reset()会使引用计数减
13、1。如果发现此时p的引用计数为0时,则reset会释放p对象。p.reset(q)p.reset(q,d)若传递了可选参数内置指针q,会将p的引用计数减1(当然,如果发现引用计数为0时,则自动释放p所管理的对象),然后令p指向q。若还传递了参数d,将会调用d而不是delete来释放q。2023/12/215第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针为了正确使用智能指针,必须坚持以下基本规范:为了正确使用智能指针,必须坚持以下基本规范:(1)不使用相同的内置指针值初始化(或)不使用相同的内置指针值初始化(或reset)多)多个个shared_ptr,原因在于,会造成二次销
14、毁。,原因在于,会造成二次销毁。int*p8=new int;shared_ptr p9(p8);shared_ptr p10(p8);/逻辑错误逻辑错误(2)不)不delete get()返回的指针。返回的指针。(3)如果使用)如果使用get()返回的指针,记住当最后一个对返回的指针,记住当最后一个对应的智能指针销毁后,该指针就变为无效了。应的智能指针销毁后,该指针就变为无效了。:2023/12/216第第3章章 类和对象类和对象-动态内存与智能指针动态内存与智能指针为了正确使用智能指针,必须坚持以下基本规范:为了正确使用智能指针,必须坚持以下基本规范:(4)默认情况下,一个用来初始化智能指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计C+ 面向对象程序设计C+课件1第3章 类和对象-动态内存与智能指针 面向 对象 程序设计 课件 动态 内存 智能 指针