예제
Widget& Widget::operator =(const Widget& rhs)
{
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
맴버변수 pb 에 있는 메모리 해제하고 재할당하는 코드이다.
딱 봐도 문제 없네라고 생각하면 문제 있다.
일단 delete 하기 전에 pb 가 NULL 이 아닌지 체크 해야되는데
그것도 있고 자기 대입연산이 문제가 된다.
자기 자신을 대입하면 자기 자신도 delete , rhs 도 delete ...ㅋ
if(this == &rhs) return *this;
자기 자신 대입이라면 이처럼 그냥 리턴하면 된다.
Effective에서는 개선된 방향으로
Widget& Widget::operator =(const Widget& rhs)
{
Bitmap *pOrig = *pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
new 에서 예외가 발생될때 문제 없게 수정된 코드다
이왕이면 여기에 if(this == &rhs) return *this; 이것도 추가 하는게 좋을 듯 한데...