大家好,又见面了,我是全栈君。
在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;
};
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115960.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...