在operator=中处理“自我赋值”
什么是自我赋值,非常明显。
就是自己的值赋值给了自己。以下的代码就是自我赋值:
class Widget{public: Widget& operator=(const Widget& rhs) { delete p; p=new int(ths.p); return *this; } int *p;};Widget w1,w2;w1=w2;w1=w1;//自我赋值。
如上代码,自我赋值的时候会出现删除自身数据的操作,这样非常危急。由于p变成了野指针。
为了防止以上错误能够进行“自我測试”,假设发现是自我赋值就直接返回。
例如以下代码:
class Widget{public: Widget& operator=(const Widget& rhs) { if(this==&rhs)//自我測试 return *this; delete p; p=new int(rhs.p); return *this; } int *p;};
可是。以上代码有还有一个缺陷,就是一旦new一个新空间失败,p还是会变成野指针。
所以,能够先保存原来的数据,等new成功之后在进行数据替换; 再次改动代码例如以下:class Widget{public: Widget& operator=(const Widget& rhs) { int tmp=p;//记录原先内存 p=new int(rhs.p); delete tmp;//释放原先内存 return *this; } int *p;};