C++ 在 operator=() 處理 self assignment

self assignment:object 被 assign 給自己。

class member 有 pointer 時寫 operator=() 要小心處理 self assignment。如果先把自己原本的 member delete 掉,等同把 rhs 的 member 也 delete 掉,assign 後會得到爛掉的 pointer。

1
2
3
4
5
6
7
8
9
10
11
12
Foo& Foo::operator=(const Foo& rhs)
{
Bitmap* pOrig = pb; // pb is member pointer in Widget

if (rhs.pb != NULL)
pb = new Bitmap(*rhs.pb);
else
pb = NULL;

delete pOrig;
return *this;
}

這做法可以處理 member pointer 但會讓 member pointer 指的位置經過 self assignment 後變得不同,另一種做法是檢查 this 是否跟 &rhs 相同,不同時才真的做 copy。

Ref

  • 《Effective C++》