首页 > 编程语言 > 详细

Effective C++ 条款11

时间:2016-02-21 12:42:48      阅读:162      评论:0      收藏:0      [点我收藏+]

在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;
};

Effective C++ 条款11

原文:http://www.cnblogs.com/yxwkf/p/5204630.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!