본문 바로가기
C,C++

[Effective C++] 항목 11 : operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자.

by matters_ 2019. 7. 25.

오늘부터는 가독성을 위해 제일 처음에 요약부분을 넣도록 하겠다.

요약

  • operator=을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만들자. 원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다.
  • 같은 맥락으로 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 같은 객체인 경우에 정확하게 동작하는지 확인해 보자.

자기 대입이란?

어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것을 말한다.

오늘은 자기대입의 경우 발생할 수 있는 예외처리에 대해 알아본다.

 

Widget& Widget::operator=(const Widget& rhs)
{ 
 delete pb;
 pb = new Bitmap(*rhs.pb);
 
 return *this;
 }

위의 코드는 rhs와 *this가 같은 객체이면 delete pb에 의해 자신이 사라져 버리기 때문에 위험한 코드이다.

따라서 아래와 같이 if문을 삽입해야 된다.

Widget& Widget::operator=(const Widget& rhs)
{ 
 if(this == &rhs) return *this;
 
 delete pb;
 pb = new Bitmap(*rhs.pb);
 
 return *this;
 }

책에는 위의 코드말고도 값의 의한 전달(call by value)로 예외처리를 막는 방법도 소개되어 있지만 메모리를 더 쓰고 복사를 한다는 점에서 위의 코드보다 좋지 않은 알고리즘이라 판단할 수 있다.

따라서 두 개 이상의 객체를 대입하거나 대입연산자 함수를 만든다면 2개 이상의 객체가 같을 때의 예외처리를 반드시 해주자!

댓글