2013-01-10 2 views
7

이 같은 unique_ptr 초기화 경우 : 문제는,표준 :: unique_ptr :: 재설정하고 생성자 예외

std::unique_ptr<Foo> i; 
i.reset(new Foo()); 

하지만 예외가 Foo::Foo()에서 발생됩니다 : 메모리 할당 무슨 일? unique_ptr이 유출되는 것을 어떻게 피합니까? 이것은 new 연산자 안에서 처리되는 것입니까?

소멸자는 범위가 종료 될 때 확실히 호출됩니다. reset 호출은 new Foo()이 반환 될 때까지 호출되지 않으므로 예외가 생성자를 벗어날 때 할당 된 메모리를 해제하여 new으로 처리해야합니다.

그런가요?

+0

는'make_unique'이있는 경우 http://stackoverflow.com/questions/4094996/what-happens-to-the-memory-allocated-by-new-if-the-constructor-throws – Jon

답변

10

Foo의 생성자에서 예외가 throw되면 고유 포인터의 reset 함수가 처음 실행되지 않습니다. 따라서 유일한 포인터는 원래 값을 유지합니다.

new 개체 구성이 예외를 throw하면 expression이 메모리를 누설하지 않습니다.

+0

그리고, 한 수 참조 'i = make_unique ()'을 사용하십시오. – GManNickG

+0

또한 무엇에 대해'std :: unique_ptr p = new Bla();' – Nick

+0

@ 닉 : 그것은 어떨까요? 너 해봤 어? –