내부에서 사용하는 객체의 핸들을 반환하는 코드는 NO(effective c++ 28)
2015. 9. 4. 17:04ㆍ프로그래밍/Effective C++
728x90
728x90
핸들이란?
핸들은 구체적인 어떤 대상을 접근하기 위한 용도로 쓰이는 매개체이다.
핸들로서 레퍼런스 변수와 포인터 변수, 반복자가 여기에 해당한다.
핸들 반환
핸들을 반환한다는 것은 메모리에 접근하여 데이터를 수정할 수 있게 한다는 것이다.
그 때문에 객체의 캡슐화는 무너진다.
const를 사용하여 어느 정도 보완할 수 있다. 그렇지만 무효 참조 핸들(Dangling handle)이 발생 할 수 있다.
무효 참조 핸들
핸들이 있기는 하지만 그 핸들을 따라갔을 때 실제 객체의 데이터가 없는 것을 의미한다.
핸들을 반환하게 되면 자주 발생하는 현상이다.
예시
문제
마지막 문장 끝날 즈음에는 boundingBox()함수에서 생긴 임시 객체가 사라지면서 소멸자를 호출 할 것이다.
아마도 정상인이라면 이 객체 내부에 동적할당을 한 포인터가 있다면 소멸자에서 해제를 해주기 마련이다.
그렇다면 그 해당 임시객체는 포인터를 해제할 것이다.
본래 이 값을 가지고 있던 객체는 임시 객체에 주소 값을 주면 문제가 생긴다.
정리
- 어떤 객체의 내부요소에 대한 핸들( 레퍼런스, 포인터, 반복자 )을 반환하는 것은 되도록 피하자.
- 캡슐화 정도를 높이고 상수 멤버 함수가 객체의 상수성을 유지한 채로 동작할 수 있도록 하며
무효 참조 핸들이 생기는 경우를 최소할 수 있다. (핸들에 const를 붙였느냐 안 붙였냐는 상관없습니다. )
- 핸들을 반환하는 멤버 함수를 절대로 두지 말라는 것이 아니고 ‘피하자’이다.
728x90
반응형
'프로그래밍 > Effective C++' 카테고리의 다른 글
인라인함수 따져보기(effective c++ 30) (0) | 2015.09.04 |
---|---|
예외 안정성 확보(effective C++ 29) (0) | 2015.09.04 |
캐스팅 절약(effective c++ 27) (0) | 2015.09.04 |
변수 정의 최대한 늦추기(effective c++ 26) (0) | 2015.08.25 |
예외를 던지지않는 swap(effective c++ 25) (0) | 2015.08.25 |
타입변환이 모든 매개변수에 적용된다면? 그 함수는 비멤버로(effective c++ 24) (0) | 2015.08.25 |
멤버 함수보단 비멤버 비프렌드 함수를!(effective c++ 23) (0) | 2015.08.25 |