数据结构C++语言实现系列文章的代码实现不使用STL库,在智能指针、异常类、顶层父类三大基础类上进行代码实现,本文介绍智能指针类。
.C++语言存在的问题C++语言中没有垃圾回收机制,指针无法控制所指堆空间的生命周期,如果在动态申请堆空间后不释放堆空间,就会造成内存泄漏。
2.解决内存泄漏的方案C++语言中提供了智能指针的方案解决内存泄漏的问题。使用智能指针,在指针生命周期结束时主动释放堆空间,一片堆空间最多由一个指针标识,同时杜绝指针运算和指针比较。
3.智能指针的设计方案通过类模板(泛型编程)描述指针的行为,使用类模块就能够定义不同的指针对象。重载指针操作符”-”和”*”,利用智能指针对象模拟原生指针的行为。
4.智能指针实例#ifndefSMARTPOINTER_H_INCLUDED#defineSMARTPOINTER_H_INCLUDED#includeiostreamusingnamespacestd;templatetypenameTclassSmartPointer{protected:T*m_pointer;public:SmartPointer(T*p=NULL){this-m_pointer=p;cout"constructfunction:SmartPointer()"endl;}SmartPointer(constSmartPointerTobj){this-m_pointer=obj.m_pointer;const_castSmartPointerT(obj).m_pointer=NULL;cout"copyconstructfunction:SmartPointer(constSmartPointerTobj)"endl;}SmartPointerToperator=(constSmartPointerTobj){if(this!=obj){deletem_pointer;this-m_pointer=obj.m_pointer;const_castSmartPointerT(obj).m_pointer=NULL;}cout"copyoperation=function:SmartPointerToperator=(constSmartPointerTobj)"endl;return*this;}T*operator-(){returnm_pointer;}Toperator*(){return*m_pointer;}T*get(){returnm_pointer;}boolisFull(){return(m_pointer==NULL);}~SmartPointer(){cout"deconstructfunction:~SmartPointer()"endl;deletem_pointer;}};#endif//SMARTPOINTER_H_INCLUDED
#includeiostream#include"SmartPointer.h"usingnamespacestd;classTest{public:Test(intnum=0):i(num){cout"constructfunction:Test()"endl;}Test(Testobj){cout"copyconstructfunctionTest(Testobj)"endl;this-i=obj.value();}~Test(){cout"deconstructfunction:~Test()"endl;}intvalue(){returnthis-i;}private:inti;};intmain(){SmartPointerTestsp=newTest(3);coutsp-value()endl;cout(*sp).value()endl;SmartPointerTestnp;np=sp;coutnp-value()endl;cout(*np).value()endl;coutsp.isFull()endl;coutnp.isFull()endl;return0;}5.智能指针的使用限制
智能指针只能用来指向堆空间中的单个对象或者变量,智能指针不能用来指向堆空间中的一个数组,也不能指向一个局部的对象或变量。
6.小结()指针特征操作符(-和*)可以被重载
(2)重载指针特征符能够使用对象代替指针
(3)智能指针只能用于指向堆空间中的内存
(4)智能指针的意义在于最大程度的避免内存问题
参考资料:《C++primer》
《C++对象模型》
狄泰软件学院唐佐林老师课程
End
欢迎点赞,