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로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한문장으로 만들자! 그렇지 않으면.. 자원누출가능성이있다.
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 19. 클래스 설계는 타입 설계와 똑같이 취급하자 (0) | 2020.01.07 |
---|---|
항목 18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 (0) | 2020.01.07 |
항목 16. new 및 delete 를 사용할 때는 형태를 반드시 맞추자 (0) | 2020.01.02 |
항목 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근하도록 하자. (0) | 2019.12.30 |
항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 (0) | 2019.12.30 |
댓글