1 / 23
文档名称:

智能指针实现.doc

格式:doc   大小:119KB   页数:23页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

智能指针实现.doc

上传人:文库旗舰店 2019/10/18 文件大小:119 KB

下载得到文件列表

智能指针实现.doc

文档介绍

文档介绍:C++中智能指针的设计和使用转载请标明出处,原文地址:c++deleteconstructorclassreference智能指针(smartpointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(referencecount)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。智能指针就是模拟指针动作的类。所有的智能指针都会重载->和*操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。auto_ptr即是一种常见的智能指针。智能指针通常用类模板实现:[cpp]viewplaincopy1template<classT> 2classsmartpointer 3{ 4private: 5  T*_ptr; 6public: 7  smartpointer(T*p):_ptr(p) //构造函数 8  { 9  } 10  T&operator*()    //重载*操作符 11  { 12    return*_ptr; 13  } 14  T*operator->()   //重载->操作符 15  { 16    return_ptr; 17  } 18  ~smartpointer()    //析构函数 19  { 20    delete_ptr; 21  } 22}; 实现引用计数有两种经典策略,在这里将使用其中一种,这里所用的方法中,需要定义一个单独的具体类用以封装引用计数和相关指针:[cpp]viewplaincopy23//定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针 24//这个类的所有成员都是private,我们不希望普通用户使用U_Ptr类,所以它没有任何public成员 25//将HasPtr类设置为友元,使其成员可以访问U_Ptr的成员 26classU_Ptr 27{ 28  friendclassHasPtr; 29  int*ip; 30  size_tuse; 31  U_Ptr(int*p):ip(p),use(1) 32  { 33    cout<<"U_ptrconstructorcalled!"<<endl; 34  } 35  ~U_Ptr() 36  { 37    deleteip; 38    cout<<"U_ptrdistructorcalled!"<<endl; 39  } 40}; HasPtr类需要一个析构函数来删除指针。但是,析构函数不能无条件的删除指针。”条件就是引用计数。如果该对象被两个指针所指,那么删除其中一个指针,并不会调用该指针的析构函数,因为此时还有另外一个指针指向该对象。看来,智能指针主要是预防不当的析构行为,防止出现悬垂指针。如上图所示,HasPtr就是智能指针,U_Ptr为计数器;里面有个变量use和指针ip,use记录了*ip对象被多少个HasPtr对象所指。假设现在又两个HasPtr对象p1、p2指向了U_Ptr,那么现在我delete p1,use变量将自减1, U_Ptr不会析构,那么U_Ptr指向的对象也不会析构,那么p2仍然指向了原来的对象,而不会变成一个悬空指针。当deletep2的时候,use变量将自减1,为0。此时,U_Ptr对象进行析构,那么U_Ptr指向的对象也进行析构,保证不会出现内存泄露。包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不会复制指针指向的对象。大多数C++类用三种方法之一管理指针成员(1)不管指针成员。复制时只复制指针,不复制指针指向的对象。当其中一个指针把其指向的对象的空间释放后,其它指针都成了悬浮指针。这是一种极端(2)当复制的时候,即复制指针,也复制指针指向的对象。这样可能造成空间的浪费。因为指针指向的对象的复制不一定是必要的。(3)第三种就是一种折中的方式。利用一个辅助类来管理指针的复制。原来的类中有一个指针指向辅助类,辅助类的数据成员是一个计数

最近更新

肾脏结构和功能 73页

2024年年度培训工作计划15篇 58页

基于物理参数的抗蛇行减振器力学模型研究的开.. 2页

2024年年会优秀员工发表获奖感言 8页

基于氧化石墨烯的荧光核酸生物传感器的开题报.. 2页

基于模糊PID控制的无刷直流电机控制系统的设计.. 2页

2024年常规教学心得体会 35页

2024年帮妈妈做家务日记 12页

2024年师德师风考核自我评价(合集4篇) 9页

基于提高用能效率的分布式电源优化及孤岛划分.. 2页

基于徽州传统建筑装饰艺术风格的现代室内设计.. 2页

肝癌的射频消融治疗 51页

肝应用解剖及肝段划分 40页

肌电图和脑诱发电位崔丽英ppt课件 56页

本地地址数据治理和审查 31页

短连接流量特征与异常检测模型 31页

基于吡咯并吡咯二酮结构窄带隙材料的设计、合.. 2页

基于变分水平集的图像分割与三维重建的开题报.. 2页

基于光子晶体编码微球的农药多残留检测技术构.. 2页

基于信息化的CS市属县级供电企业的内部会计控.. 2页

2024年工厂普通员工个人总结(15篇) 34页

2024年工厂实习工作总结十五篇 59页

基于临界稳定状态的边坡稳定分析的开题报告 2页

(精校版)2023年浙江英语高考试题文档版(含.. 11页

电镀黑铬工艺 10页

电镀六价铬讲议 10页

中考历史非选择题答题技巧 4页

温康纳自动贴面生产线作业指导书 15页

计算机桌面运维技术服务方案 32页

ESC基础培训20100811-1 64页