자기대입이 왜 위험한가?
같은 객체를 가리키는 참조자 두개(A 와 B)가 A = B 라고 해 놓고 delete B 라고 했을 때, A가 가르킨 객체는 이미 전기적 신호를 받고 날라간 상태이다.
그렇기 때문에, 같은 타입으로 만들어진 객체 여러 개를 참조자 혹은 포인터로 물어 놓고 동작하는 코드를 작성할 때는 같은 객체가 사용될 가능성을 고려하는 것이 일반적으로 바람직한 자세이다.
어떻게 이 위험으로부터 보호하겠는가?
참조자의 경우, 주소가 같기 때문에, 같은 주소인지 if문으로 비교하여, 같다면 하는일 없이 리턴을 하지만, 자기 대입이 일어날 경우는 적기 때문에, 모든 객체에 대해서 조사하는것은 효율이 낮다.
그렇기 때문에 우선 매개체를 복사한 후에, 복사된 매개체와 내자신과 바꾸는 방법을 많이 사용한다.
흔히들 이 기법을 복사후 맞바꾸기(copy and swap)라고 한다
이것만은 잊지 말자!
1. operator=을 구현할 때는 꼭 자기대입에 대한 처리도 염두해 두어야 한다.
2. 두개 이상의 객체를 받는 함수도 같은 객체가 넘겨졌을 때 이 처리 역시 염두해 두어야 한다.
기법 소스
문제가 있는 코드
해결 코드
관련링크
http://jangyeol.springnote.com/pages/348598.xhtml
http://evax.springnote.com/pages/871438
http://ilu8318.egloos.com/1705010
http://ikpil.tistory.com/299
같은 객체를 가리키는 참조자 두개(A 와 B)가 A = B 라고 해 놓고 delete B 라고 했을 때, A가 가르킨 객체는 이미 전기적 신호를 받고 날라간 상태이다.
그렇기 때문에, 같은 타입으로 만들어진 객체 여러 개를 참조자 혹은 포인터로 물어 놓고 동작하는 코드를 작성할 때는 같은 객체가 사용될 가능성을 고려하는 것이 일반적으로 바람직한 자세이다.
어떻게 이 위험으로부터 보호하겠는가?
참조자의 경우, 주소가 같기 때문에, 같은 주소인지 if문으로 비교하여, 같다면 하는일 없이 리턴을 하지만, 자기 대입이 일어날 경우는 적기 때문에, 모든 객체에 대해서 조사하는것은 효율이 낮다.
그렇기 때문에 우선 매개체를 복사한 후에, 복사된 매개체와 내자신과 바꾸는 방법을 많이 사용한다.
흔히들 이 기법을 복사후 맞바꾸기(copy and swap)라고 한다
이것만은 잊지 말자!
1. operator=을 구현할 때는 꼭 자기대입에 대한 처리도 염두해 두어야 한다.
2. 두개 이상의 객체를 받는 함수도 같은 객체가 넘겨졌을 때 이 처리 역시 염두해 두어야 한다.
기법 소스
문제가 있는 코드
해결 코드
관련링크
http://jangyeol.springnote.com/pages/348598.xhtml
http://evax.springnote.com/pages/871438
http://ilu8318.egloos.com/1705010
http://ikpil.tistory.com/299
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
항목 16: new 및 delete를 사용할 때는 형태를 반드시 맞추자 (0) | 2008.06.03 |
---|---|
항목 15: 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자. (0) | 2008.06.02 |
항목 14: 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 (0) | 2008.06.01 |
항목 13: 자원 관리에는 객체가 그만! (0) | 2008.06.01 |
항목 12: 객체의 모든 부분을 빠짐없이 복사하자 (0) | 2008.06.01 |
항목 10: 대입 연산자는 *this의 참조자를 반환하게 하자. (0) | 2008.05.31 |
항목 9: 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 (0) | 2008.05.31 |
항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자. (0) | 2008.05.31 |
항목 7: 다향성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 (0) | 2008.05.31 |
항목 6: 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 (0) | 2008.05.31 |
최근댓글