new 로 생성한 객체를 스마트 포인터에 저장할 때 발생할 수 있는 문제

int priority(); // 우선순위를 반환하는 함수
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);

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

Order of Evaluation of Arguments (c++의 인자 평가 순서)

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

해결 방법 : new 로 생성한 객체를 먼저 스마트 포인터에 저장

std::tr1::shared_ptr<Widget> pw(new Widget); // 스마트 포인터에 먼저 저장
processWidget(pw, priority()); // 안전한 호출

std::make_shared 를 활용한 더 안전한 방법

auto pw = std::make_shared<Widget>(); // 안전한 스마트 포인터 생성
processWidget(pw, priority()); // 예외 발생해도 안전