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

来源:互联网 发布:mac如何卸载app 编辑:程序博客网 时间:2024/05/18 03:34

别在停止使用资源前释放它

class Bitmap{};class Widget{public:    Widget()    {        pb = NULL;    }    Bitmap *pb ;    Widget& operator=(const Widget&);};Widget& Widget::operator=(const Widget& rhs){    delete pb;    pb = new Bitmap(*rhs.pb);    return *this;}Widget a, b;a = b;/*上述a=b进行赋值是有问题的,因为operator=函数内*this和rhs有可能是同一个,所以在delete pb时有可能把当前对象的bitmap和rhs的bitmap都删除了,这时候pb就指向已被删除的对象*/
Widget& Widget::operator=(const Widget& rhs){    Bitmap* pOrig = pb;    pb = new Bitmap(*rhs.pb);    delete pOrig;    return *this;}/*上述operator=函数中先用pOrig记住原先的pb,然后用pb指向*pb的一个副本,最后删除pOrig(就是原来的pb)*/
阅读全文
0 0