본문 바로가기

c++ 언어/Effective C++

operator =에서는 자기대입에 대한 처리가 빠지지 않도록 하자


예제

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; 이것도 추가 하는게 좋을 듯 한데...