关于 运算符=() 来自 Meyers 的书

About operator=() from Meyers's book

本文关键字:来自 Meyers 的书 运算符 关于      更新时间:2023-10-16

我正在读S. Meyers的书"有效C++。55种具体方式..."(第3版)。这本书中的某些内容,在规则 11 中我不明白。因此,在下一个代码部分中:

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

为什么使用"pOrig"?

附言对不起我的英语不好。

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

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

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

此外,正如 Angew 在评论中指出的那样,通过使用临时来保持内部状态一致,您还可以防止自我分配,并且可以跳过自我分配测试作为附带好处。