본문 바로가기
책 정리/Effective C++ 3rd

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

by ocean20 2020. 1. 2.
int priority(); //우선순위처리 함수
void processWidget(std:;tr1::shared_ptr<Widget> pw, int priority);

위에서 processWidget 어떻게 호출할까?

 

아래와 같이 하면 될까?

processWidget(new Widget, priority());

에러이다.

 

이유?

tr1::shared_ptr explicit으로 선언되어 있기 대문에 암시적형변환이 불가하다. 정확하게 타입을 기재해주어야한다.

 

따라서

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

라고 기재해주면된다?

 

하지만 여기서도 자원낭비가 발생한다.

그이유는 호출프로세스에서 빵꾸 있기때문이다.

 

* processWidget 호출프로세스를 살펴보자(컴파일러마다 다르다, 2<-> 3 변경가능성도 있다.)

1. new Widget 표현식 실행

2. priority 호출

3. tr1::shared_ptr 생성자 호출

 

만약 priority 호출에서 에러가 나면.. new Widget으로 만들어진 포인터가 유실될수 있다.

 

따라서 다음과 같이 Widget 별도의 독립적인 한문장으로 만든 넘긴다.

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

이것만은 잊지 말자!

  - new 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한문장으로 만들자! 그렇지 않으면.. 자원누출가능성이있다.

댓글