您的位置:首页 > 运维架构

条款十一 在operator = 中处理"自我赋值"

2012-07-27 23:49 274 查看
1.在operator = 中,有可能自己给自己赋值
a[i] = a[j] //潜在自我赋值, 当i = j时
*py = *px //潜在自我赋值 当py和px指向同一个地址时

2.自我赋值的不安全性
class Test{...};
class ManTest
{
ManTest& operator = (const ManTest& rhs)
{
delete p;
p = new Test(*rhs.p);
return *this;
}
private:
Test *p;
};

安全问题:当*this和rhs是同一个对象时,delete释放p的内存空间,然后new一块内存指向不存在的空间
所以就出问题
可以改一下operator = 函数
ManTest& operator = (const ManTest& rhs)
{
if(this == &rhs) return *this;
delete p;
p = new Test(*rhs.p);
return *this;
}

3.如果new时候发生异常,如何处理? this.p指针就是野指针了
ManTest& operator = (const ManTest& rhs)
{
if(this == &rhs) return *this;
Test *pTemp = p; //定义一个中介值
p = new Test(*rhs.p);
delete pTemp;
return *this;
}

这样如果new发生异常,不会继续向下指向,p指向原来的内存空间就不会被删除

4.定义一个swap()函数
void swap(ManTest rhs) //注意这里参数类型不是ManTest &rhs;
{....} //按值传参会有一份副本产生,这里将副本的数据赋给this,这样rhs的原来数据不会改变
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: