Self-assignment occurs when an object is assigned to itself, for example:
val = val;
Vec[i] = vec[j];//potential self-assignment (I=J)
*p = *q; potential self-assignment
Class A
{
a& operator= (const a& RHS)//unsafe assignment version
{
Delete p;//stop using the current object
p = new P (RHS.P);//Use copy of RHS
return *this;
}
B p;
}
Solution One: The use of certificates and testing
a& operator= (const a& RHS)
{
if (this = = &RHS) return *this; Certificate and test
Delete p;//stop using the current object
p = new B (RHS.P);//Use copy of RHS
return *this;
}
This version has an exception security, if new has an exception or B uses copy to construct the exception, a will eventually hold a pointer to a deleted b
Solution Two: Remember the original object
a& operator= (const a& RHS)
{
B *pp = p;//Remember the original p
p = new B (RHS.P);//Another P points to a copy of the *p
Delete pp;//Remove the original p
return *this;
}
Handling self-assignment problems in assignment operators