포인터 관련해서 프로그래머는 많은 이야기를 듣게 되듣이 예외 안전성에 있어 포인터는 참 안타까우면서 놀라운 존재로 보여진다.
이번 항목은 함수의 매개변수에 포인터를 넘기게 될 때 문제가 생길 수 있음을 지적한다.
이번 항목은 함수의 매개변수에 포인터를 넘기게 될 때 문제가 생길 수 있음을 지적한다.
질문
1. 다음의 예제에서 함ㅅ f,g,h와 구문 expr1 과 expr2가 계산되는 순서는 어떻게 되는가? 이때 expr 들은 한번만 실행되는 구조이다.
2. 이 코드의 예외 안전성 문제가 발생할 가능성이 있는가?
해설
질문 1은
함수 호출시 어떻게 진행되는지 그 규칙을 알기만 하면 쉽게 답을 찾을 수 있다. 규칙을 따라가면 우선 함수의 매개변수의 값이 최우선으로 계산된다.그리고 이 처리가 다 끝나면, 드디어 함수가 호출되면서 매개변수로써 전달이 f 함수에 되게 되는데, 이 때, 이 전달되는 순서를 보장 할 수 없다.
컴파일러마다 이 전달되는 순서를 다르게 두고 있기 때문이다. 결국 이런 구조는 너무 컴파일러에 의존적이 되므로, 문제가 생길 충분한 소재를 제공해 준다는데에 문제점이 있다고 보고 있다.
질문 2는
질문1에서 설명한것과 같이, T1 에 대한 메모리가 발생하고 T2에 대한 메모리 생성시 실패햇을 때, T1에 대한 메모리를 해제 할수 없는, 매우 큰 문제점을 가지고 있다.
결국 질문 1을 해결 하기 위해선 함수 호출 전에 이미 그 표현식을 완료 시킨 다음, 함수에 전달해야 할것이다.
예제코드
질문 2의 문제를 격기 위해선 smart_ptr을 사용 하는게 제일 좋을 듯 싶다. 물론 질문1의 해결 방법을 쓰고, smart_ptr로 넘긴다.
총평
이 문제 해결법은 프로그래머 평생에 있어, 아주 견고한 방법 중에 한가지이니 꼭 익혀야 될 필수 사항이라 불릴만 하다고 생각 한다.
'책 정리 > More Exceptional C++' 카테고리의 다른 글
항목 39 : 네임스페스 Part 1 : using 선언과 using 지시자 (난이도 : 2) (1) | 2008.12.08 |
---|---|
항목 38 : typedef (난이도 : 3) (0) | 2008.12.08 |
항목 37 : 전방 선언(forward dclarations) (난이도 : 3) (0) | 2008.12.08 |
항목 36 : 초기화 (변수 초기화, 생성자의 문제점) (난이도 : 3) (0) | 2008.12.07 |
항목 23 : 예외 안전 클래스 설계 Part 2 : 상속 (난이도 : 6) (0) | 2008.12.06 |
항목 22 : 예외 안전 클래스 설계 Part 1 : 복사 지정 연산(copy assignment) (난이도 7) (0) | 2008.12.06 |
항목 21 : 관리되지 않은 포인터 문제 Part2 : auto_ptr은? (난이도 8) (0) | 2008.12.06 |
항목 19 : 처리되지 않은 예외 (0) | 2008.12.04 |
항목 18 : 생성자 실패 Part2 : 흡수? (0) | 2008.12.03 |
항목 17 : 생성자 실패 Part 1 : 객체의 수명 (난이도 : 4) (0) | 2008.12.02 |
최근댓글