페이지

2015년 1월 4일 일요일

new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들다.

* new로 생성한 객체를 스마트 포인터로 넣는 코드는별도의 한 문장으로 만듭시다. 이것이 안 되어 있으면, 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될 수 있습니다.

int priority() { ... };
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority) { ... };

processWidget(std::tr1::shared_ptr<Widget>(new Widget()), priority());

 위의 Code를 봤을 때 processWidget의 인자에는 3가지 함수 호출이 일어난다.

 - priority() 실행
 - Widget 생성자 실행
 - tr1::shared_ptr의 생성자 실행

 C#이나 Java의 경우 인자의 실행 순서가 정해져 있지만, C++의 경우 Compiler 제작사마다 다를 수 있다.

아래의 경우를 생각해보자.

 1. Widget 생성자 실행
 2. priority() 를 실행하다가 예외발생




 위의 경우에는 Widget 생성자로 만들었던 포인터가 유실될 수 있다.

댓글 없음:

댓글 쓰기