effective第11个条款举的这个例子:
Widget& Widget::operator=(const Widget& rhs) //一份不安全的operator=实现版本
{
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
像上面这样写,自我赋值肯定会出现问题,但是为什么要先释放掉pb呢?为什么不直接像下面这样重赋值呢?
Widget& Widget::operator=(const Widget& rhs) //一份不安全的operator=实现版本
{
pb = new Bitmap(*rhs.pb);
return *this;
}
第二種寫法當自我複製時會造成記憶體洩漏
pb的作用就是在可以引用的值和堆上的記憶體物件之間進行綁定的,你要存取堆上的物件的話,需要透過pb來操作。
見上圖,按照你舉得例子,你指示讓pb又指向了一個新的堆上內存地址,但之前的你沒有顯示delete掉,就會產生內存洩漏。
洩漏的例子