C++的RAII和智能指针小结-创新互联
RAII:资源分配即初始化,利用构造函数和析构函数定义一个类来完成对资源的分配和释放
成都创新互联公司主营双牌网站建设的网络公司,主营网站建设方案,App定制开发,双牌h5微信平台小程序开发搭建,双牌网站营销推广欢迎双牌等地区企业咨询智能指针主要用来防止内存泄漏,我们来举个栗子,看看为什么会有智能指针这个东东
例1:
对于上面这段程序,由于抛出异常的时候影响了代码的执行流,所以要在异常捕获之前将p提前释放(详见
我的博客:C++的异常浅析),虽然可以通过再次抛出以异常解决这个问题,但是在代码美观方面不够完
美,更重要的是如果在代码量非常大,而且在多处有动态开辟出来的空间的时候,仅仅通过再次抛出异常已
经远远不够解决这个问题了,会使得工作量大大加大,那么有没有什么办法可以解决这种问题,而且不增加
工作量呢?
此刻就轮到我们的智能指针出场啦
首先我们先来认识五种智能指针
autoptr:管理权的转移(最好不要使用,比较鸡肋)
scoped ptr:强制防拷贝(针对和指针)
scoped array:强制防拷贝(针对数组)
shared ptr:引用计数,通过增减计数器来管理,最后一个对象释放(针对指针)
shared array:同上,针对数组
第一个先来看看autoptr类的实现
在我们刚开始学C++的时候可以知道当一个对象出了其作用域,就会自动调用她的析构函数,而智能指针正
是利用了这个原理,在用智能指针构造对象的时候就会自动调用析构函数,这样就不会发生内存泄漏的问题
了。
那么问题又来了,智能指针本身并不是一个真正意义上的指针,而是一种“仿造”的指针,所以为了使它看
起来更像指针,就要对它的*和->进行一次重载,这样看起来就更像指针啦
。
接下来要介绍的几种智能指针相比autoptr会更实用一些,但是他们都属于boost库中的库函数,需要下载后
才能直接使用哦,我们来看一下它的类的实现
可以看出,为了防止拷贝,scopedptr的类在实现的时候将她的拷贝构造和赋值符重载声明在了protected
中,这样是为了防止有人恶意从外部对其进行实现。
记住防拷贝的两个条件:①只声明,不实现
②声明成保护或私有
而和scopedptr很相似的scoped array,实现的机制和scopedptr是很像的,只不过在访问它的内部成员时,
既不需要很麻烦了,只需要重载一下[ ],就可以很容易访问了。
最后我们再来看看sharedptr,在前面我们学过写时拷贝,同样也是利用了引入计数器,所以在这里就不是
很难理解了,在它的类里面多了一个成员_pcount,表示指向当前对象的指针的个数,这样可以直观的理解
sharedptr的实现机制了
现在就剩下sharedarray了,和sharedptr一样,只需要重载它的[ ],其余的就和sharedptr差不多了
通过上面的简单介绍,相信大家对智能指针也有一定的了解了,既然智能指针这么好用,后面的编程肯定会
有很多地方用到它,所以掌握它们的用法是很重要的咯。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
分享名称:C++的RAII和智能指针小结-创新互联
标题来源:http://pwwzsj.com/article/phihd.html