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

Minsu._.Lighting·2023년 11월 20일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 안전한 자원 관리를 위한 방법! "

  • operator=을 구현할 때, 자기 대입이 일어나지 않도록 잘 처리하자!
  • 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인해보자!

💡 자기 대입?

  • 어떤 객체가 자기 자신에 대해 대입 연산자를 적용하는 것.
    • CMonster Monster; Monster = Monster;
      - 자기 대입
    • a[i] = a[j];
      - i 와 j 가 같아진다면...?
    • *px = *py;
      - 가리키는 대상이 같다면...?


💡 중복 참조에 의한 문제들..

📌 자기 참조 문제를 일으킬 수 있다.

  • *this(대입되는 대상)와 rhs가 같은 객체일 가능성이 있음.
    - 둘이 같은 객체면 delete가 두 객체 모두에 적용되어 삭제...



📌 자기 참조를 예방하자!

  • 일치성 검사
Widget& Widget::operator=(const Widget& rhs)
{
	if(this == &rhs)
    	return *this;
    
    delete pb;
    pb = new Bitmap(*rhs.pb);
    
    return *this;
}

- 자기 대입인지 검사 후 자기 대입이라면 아무 동작도 하지 않고 return.
문제점 : new Bitmap 시 예외가 발생한다면 삭제된 Bitmap을 가리키는 포인터가 생겨 다양한 문제를 일으킬 수 있음.

  • 원래의 값을 저장해 놓은 후 마지막에 삭제하자!
Widget& Widget::operator=(const Widget& rhs)
{    
    Bitmap *pOrig = pb;
    pb = new Bitmap(*rhs.pb);
    delet pOrig;
    
    return *this;
}

- 일치성 검사의 문제점 해결 가능.
- 그다지 효율적이지 못함.

  • 복사 후 맞바꾸기(copy and swap)
[예시 1]
Widget& Widget::operator=(const Widget& rhs)
{    
    Widget temp(rhs);
    
    swap(temp);
        
    return *this;
}


[예시 2] // 값에 의한 전달을 통해 복사를 일으키는 방법
Widget& Widget::operator=(Widget rhs)
{    
    swap(rhs);
        
    return *this;
}
profile
오코완~😤😤

0개의 댓글

관련 채용 정보