在Effective C++中看到这个问题时才发现以前写的代码完全没有注意过这个问题
“自我赋值”发生在对象被赋值给对象本身时,例如:
class Weight
{
...};
...
w=w;
虽然这看上去确实非常的蠢,但是谁也不能保证这不会发生,毕竟这是合法的,但是问题出来了,我们写的显示赋值函数一般是这样的,假设我们在类中使用了动态分配。
class Bitmap{
...};
class Weight
{
...
private:
Bitmap * _pb;
};
Weight & Weight::operatot=(const Weight & rhs)
{
delete _pb;
_pb=new Bitmap(rhs._pb);
return *this;
}
好的,现在面临的问题是,*this和rhs这两个指向了同一个对象,在执行delete _pb 时同时也将rhs的Bitmap销毁了。
对此提出了两种有效的解决方法
①传统做法在operator=之前做一个“证同测试(identity test)”
Weight & Weight::operatot&