关于迈耶斯的书中的operator =()

时间:2015-04-23 17:43:08

标签: c++

我是S. Meyers和#34; Effective C ++的读书。 55具体方式......" (第3版)。在本书的某些内容中,在规则11中我并不理解。所以,在下一个代码部分:

Widget& Widget::operator=(const Widget& rhs)
{
    Bitmap *pOrig = pb;
    pb = new Bitmap(*rhs.pb)
    delete pOrig;
    return *this;
}

为什么" pOrig"使用

P.S。抱歉我的英语不好。

1 个答案:

答案 0 :(得分:12)

当你在这里处理原始指针时,你必须进行适当的资源管理。在这种情况下,new Bitmap(...)可能会抛出,例如,如果进程内存不足,并且它不会更改pb指向的值,因为异常将在任务发生。

通过引入临时,您仍然可以正确管理Bitmap对象,因为如果对new的调用成功,旧对象会被删除,并且您不会泄漏内存。

如果先删除pb指向的对象,并且new Bitmap...代码导致异常,则对象处于内部混乱状态。

另外,正如Angew在评论中指出的那样,通过使用临时来保持内部状态的一致性,你也可以防止自我指派,并且可以跳过自我指派测试作为附带利益。