2008. 12. 6. 14:41 책 정리/More Exceptional C++
포인터 관련해서 프로그래머는 많은 이야기를 듣게 되듣이 예외 안전성에 있어 포인터는 참 안타까우면서 놀라운 존재로 보여진다.

이번 항목은 함수의 매개변수에 포인터를 넘기게 될 때 문제가 생길 수 있음을 지적한다.

질문

1. 다음의 예제에서 함ㅅ f,g,h와 구문 expr1 과 expr2가 계산되는 순서는 어떻게 되는가? 이때 expr 들은 한번만 실행되는 구조이다.




2. 이 코드의 예외 안전성 문제가 발생할 가능성이 있는가?




해설

질문 1은

함수 호출시 어떻게 진행되는지 그 규칙을 알기만 하면 쉽게 답을 찾을 수 있다. 규칙을 따라가면 우선 함수의 매개변수의 값이 최우선으로 계산된다.그리고 이 처리가 다 끝나면, 드디어 함수가 호출되면서 매개변수로써 전달이 f 함수에 되게 되는데, 이 때, 이 전달되는 순서를 보장 할 수 없다.

컴파일러마다 이 전달되는 순서를 다르게 두고 있기 때문이다. 결국 이런 구조는 너무 컴파일러에 의존적이 되므로, 문제가 생길 충분한 소재를 제공해 준다는데에 문제점이 있다고 보고 있다.


질문 2는

질문1에서 설명한것과 같이, T1 에 대한 메모리가 발생하고 T2에 대한 메모리 생성시 실패햇을 때, T1에 대한 메모리를 해제 할수 없는, 매우 큰 문제점을 가지고 있다.


결국 질문 1을 해결 하기 위해선 함수 호출 전에 이미 그 표현식을 완료 시킨 다음, 함수에 전달해야 할것이다.

예제코드


질문 2의 문제를 격기 위해선 smart_ptr을 사용 하는게 제일 좋을 듯 싶다. 물론 질문1의 해결 방법을 쓰고, smart_ptr로 넘긴다.


총평

이 문제 해결법은 프로그래머 평생에 있어, 아주 견고한 방법 중에 한가지이니 꼭 익혀야 될 필수 사항이라 불릴만 하다고 생각 한다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요