不检测自赋值的危险???

From:http://topic.csdn.net/t/20040830/15/3322731.html

 

 为什么在重载operator=时需要检测自赋值情况呢?  
  书上说是不检测的话很危险,能不能举例子说明??

Paris_Luo的意思是这样:  
  String::operator=(const   String&   src)  
  {  
          //不检查自赋值,一般代码如下,先释放,后拷贝  
          delete[]   data;  
          data   =   new   char[strlen(str.data)   +   1];//Paris_Luo少写了这一句  
          memcpy(data,src,strlen(str.data)+1);     //自赋值时,拷贝一块已释放的内存!!  
          return   *this;          
  }  
   
  在自赋值发生的时候,代码中的data和str.data其实是同一个,那么在第二句中就访问了在第一句中已经释放了的内存(strlen(str.data),str.data已经释放),这种操作是很危险的。  
   
  不过即使没有自赋值的问题,这段代码也有问题:  
  在data   =   new   char...时是可能产生异常的,然后对象中的data将指向一段没有释放的内存,这个对象已经不能正常工作,甚至不能正常析构。如果在delete[]data之后加一句data   =   NULL虽然可以解决这个问题,但仍然不好——这样只是保证了对象能使用而没有保证对象状态,一个好的赋值操作符应该在产生异常时保持对象状态与未赋值前一样。正确的实现应该是:  
  String::operator=(const   String&   src)  
  {  
          char   *   newdata   =   NULL;  
          if   (str.data   !=   NULL)    
          {  
                newdata   =   new   char[strlen(str.data)   +   1];  
                strcpy(newdata,   str.data);  
          }  
          delete[]   data;  
          data   =   newdata;  
          return   *this;          
  }  
  这个实现大家可以看到:即使自赋值发生了,仍然不会有问题,只不过做了一些不必要的操作罢了。所以Pari_Luo这个例子并不能说明问题,它在解决了异常安全问题之后就不存在自赋值问题了。  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值