-
Effective C++...16일지 2022. 6. 16. 07:26
new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자
C++의 연산 실행 순서
다른 언어와 달리 C++는 연산 실행 순서가 컴파일러 제조사마다 다르다.
그렇기 때문에 스마트 포인터에 자원이 저장되기 전에 에러가 발생하는 경우가 있을 수 있다.
다음은 문제가 될 수 있는 코드이다.
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
위 코드의 실행 순서는 new Widget은 항상 먼저 실행되지만 shared_ptr의 생성자와 priority()의 실행 순서는 바뀔 수 있다.
그런데 priority() 가 먼저 실행되는 경우에 priority()에서 에러가 발생한다면 스마트 포인터에 자원이 들어가기 전에 에러가 발생했으므로 메모리가 유출될 수 있다.
메모리 유출을 막는 초기화 방법
문장의 연산 실행 순서가 정해져 있지 않다면 문장을 구분하면 된다.
std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());