注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

自定义智能指针的注意点之补遗  

2015-10-20 11:14:02|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

自定义智能指针的注意点之补遗

在前面的博文中,比较详细的介绍了自定义的一个智能指针,但是也留下了两个小尾巴,一个是上面说的使用这个智能指针的时候儿应用到数组中,Reset时会报错;第二个是将这个数组直接清0的情况下,也会引起程序的异常崩溃。下面分步来说:

首先说Reset函数先看定义:

                   void reset()

                   {

                            if (pUse !=  NULL && ( --*pUse <= 0))

                            {

                                     delete ptr;

                                     //delete pUse;

 

                                     ptr = NULL;

                                     *pUse = 1;

                  //*pUse = NULL;

                            }

                   }

请注意注释掉的绿色部分,也就是说,如果去除掉这个,则程序是正常的。百思不得其解,专门写一个例程也没有问题。后来突然想到原因,是处理的分支不够,也就是说,固定数组中这个pUse已经分配了空间,这里是不能删除的,或者换句话说,你用 Delete释放内存的方法去释放全局的数组,一定不成啊。

下断点看了下,果然如此。他们的内存空间是一样的。这样说来,应该是自定义的智能指针处理的问题不全面,应用的范围有限。没有处理好智能指针如Std中的Empty值一样。

同理,这个数组直接Memset0后有问题,也是这个问题,对0的处理没有到位,必然是这种情况。也可以说,如果使用memset,应该重处理成Empty

知道问题的原因后解决就简单了,直接注释掉绿色部分或者不调用Reset都可以(如果是在其它情况下不能注释,这就是下面说得适应有问题。),但适应起来还是有问题,有时间把这个自定义的智能指针丰富起来,然后形成自己的一个小库。意义虽然不大,但可以增强了解标准库中的知识。

总结一下:

1、因为处理的不全,当遍历数组Reset时,会delete pUse,那么下面再*pUse = 1;直接就挂掉了。

2、如果设置了注释的pUse = NULL;则在第一次使用完成后,数组中的*pUse = 0,则赋值后decrUse();就地释放掉智能指针当前的计数器,而前面此指针已经为空,崩溃退出。

3、处理的情况包括未发现的基本类似于上面两种,计数器判断不科学。但暂时尚未有更合理的方法。有时间学习一下标准库和BOOST库的智能指针实现的方法。

焦点实际是是对empty处理。

努力要从今日始。

  评论这张
 
阅读(278)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017