void doSomething(const Base& rb, // rb and *pd might actually be Derived* pd); // the same object 假如你遵循 Item 13 和14 的建議,你應該總是使用對象來治理資源,而且你應該確保那些資源治理對象(resource-managing objects)被拷貝時行為良好。假如是這種情況,你的賦值運算符在你沒有考慮自拷貝的時候可能也是自賦值安全(self-assignment-safe)的。但是,假如你試圖自己治理資源,無論如何(假如你寫一個資源治理類(resource-managing class),你當然不得不做),你可能會落入在你使用完一個資源之前就已意外地將它釋放的陷阱。例如,假設你創建了一個類,它持有一個指向動態分配 bitmap 的指針:
class Bitmap { ... };
class Widget { ... PRivate: Bitmap *pb; // ptr to a heap-allocated object }; 下面是一個 Operator= 的實現,表面上看它是合理的,但假如出現自賦值則是不安全的。(它也不是異常安全(exception-safe)的,但我們要過一會兒才會涉及到它。)
Widget& Widget::operator=(const Widget& rhs) // unsafe impl. of operator= { delete pb; // stop using current bitmap pb = new Bitmap(*rhs.pb); // start using a copy of rhs’s bitmap
Widget& Widget::operator=(const Widget& rhs) { Bitmap *pOrig = pb; // remember original pb pb = new Bitmap(*rhs.pb); // make pb point to a copy of *pb delete pOrig; // delete the original pb