条款11:operator=中处理自我赋值

本文探讨了C++中不易察觉的自我赋值问题,涉及指针指向同一对象、不同类型间的赋值以及内存管理。提出两种解决方法:判断赋值前的对象状态和使用copy-and-swap技术,后者更高效但需权衡代码复杂性与运行速度。
摘要由CSDN通过智能技术生成

正常来说自我赋值是一个很愚蠢的行为,但是有一些自我赋值其实是不太容易察觉的。

例:

a[i] = a[j] //i = j 就是自我赋值

*px = *py //px py指向同一块内容就是自我赋值

甚至类型不同也可能是,自我赋值

class base{};

class derived : public base{};

void fun(base &b, derived *d);

因为父类对象的指针可以指向派生类对象。

这种自我赋值会引起引起申请的资源在没有被使用完,就被释放的错误

class bitmap

{

     class Widget

     {

         private: 

        bitmap *ptr //指向一块堆空间 

     }
};

//不安全的operator

Widget&Widget::operator=(const Widget &rhs)

{

        delete ptr;

        ptr = new Widget(rhs);

        return *this;
}

如果rhs和ptr指向同一个对象,rhs已经被销毁了。

第一种解决办法

只需要判断一下,rhs和*this是否相等。

Widget&Widget::operator=(const Widget &rhs)

{        

        if(rhs == *this)//

        return *this;

        delete ptr;

        ptr = new bitmap(*rhs.pb);

        return *this;
}

第二种解决办法copy and swap

Widget&Widget::operator=( Widget rhs)//利用函数传值,是对原值的拷贝

{        

       swap(rhs);//将rhs和*this的数据交换

       return *this;
}

相比第一种写法,这种写法的效率更高,判断是需要成本的,会使代码变大,引入一个新的控制流分支,二者都会降低运行速度

copt-and-swap是一个高效简介的技术,非常好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值