내부에서 사용하는 객체의 핸들을 반환하는 코드는 NO(effective c++ 28)

2015. 9. 4. 17:04프로그래밍/Effective C++

728x90
728x90

핸들이란?

핸들은 구체적인 어떤 대상을 접근하기 위한 용도로 쓰이는 매개체이다.

핸들로서 레퍼런스 변수와 포인터 변수, 반복자가 여기에 해당한다.


핸들 반환

핸들을 반환한다는 것은 메모리에 접근하여 데이터를 수정할 수 있게 한다는 것이다.

그 때문에 객체의 캡슐화는 무너진다.

const를 사용하여 어느 정도 보완할 수 있다. 그렇지만 무효 참조 핸들(Dangling handle)이 발생 할 수 있다.


무효 참조 핸들

핸들이 있기는 하지만 그 핸들을 따라갔을 때 실제 객체의 데이터가 없는 것을 의미한다.

핸들을 반환하게 되면 자주 발생하는 현상이다.


예시

문제

마지막 문장 끝날 즈음에는 boundingBox()함수에서 생긴 임시 객체가 사라지면서 소멸자를 호출 할 것이다.

아마도 정상인이라면 이 객체 내부에 동적할당을 한 포인터가 있다면 소멸자에서 해제를 해주기 마련이다. 

그렇다면 그 해당 임시객체는 포인터를 해제할 것이다. 

본래 이 값을 가지고 있던 객체는 임시 객체에 주소 값을 주면 문제가 생긴다.


정리

- 어떤 객체의 내부요소에 대한 핸들( 레퍼런스, 포인터, 반복자 )을 반환하는 것은 되도록 피하자.


- 캡슐화 정도를 높이고 상수 멤버 함수가 객체의 상수성을 유지한 채로 동작할 수 있도록 하며 

무효 참조 핸들이 생기는 경우를 최소할 수 있다. (핸들에 const를 붙였느냐 안 붙였냐는 상관없습니다. )


- 핸들을 반환하는 멤버 함수를 절대로 두지 말라는 것이 아니고 ‘피하자’이다.



728x90
반응형