더북(TheBook)

1.6.1.1 unique_ptr<T> 객체를 초기화하기

스마트 포인터가 소멸될 때 unique_ptr<T> 객체가 가리키는 객체도 소멸된다. unique_ptr<T> 객체에 인수 없이 reset()을 호출하면 유니크 포인터가 가리키는 객체를 소멸시키고 unique_ptr<T> 객체의 원시 포인터를 nullptr로 교체한다. 즉, reset()을 호출하면 유니크 포인터가 가리키는 객체를 언제든지 소멸시킬 수 있다.

auto pname = std::make_unique<std::string>("Algernon");
...
pname.reset();         // string 객체의 메모리를 해제한다

T 객체의 주소를 reset()에 전달해도 된다. 이렇게 하면 unique_ptr<T>가 가리키던 이전 객체는 소멸되고, unique_ptr<T>의 주소는 새 객체의 주소로 대체된다.

auto pname = std::make_unique<std::string>("Algernon");
...
pname.reset(); // string 객체의 메모리를 해제한다

이 코드는 pname이 가리키던 원본 문자열의 메모리를 해제하고, 자유 공간에 새 string 객체 "Fred"를 생성하고, pname에 새 객체의 주소를 저장한다.

Caution

다른 unique_ptr<T> 객체의 reset()에 자유 공간 객체의 주소를 전달하거나 다른 unique_ptr<T> 객체가 이미 갖고 있는 주소를 사용해서 새 unique_ptr<T> 객체를 생성해서는 안 된다. 이런 코드는 컴파일은 되겠지만, 프로그램은 반드시 충돌한다. 첫 번째 unique_ptr<T> 객체가 소멸하면서 unique_ptr<T> 객체가 가리키던 객체의 메모리가 해제될 것이다. 이어서 두 번째 unique_ptr<T> 객체가 소멸하면 이미 해제된 메모리를 해제하려 하면서 문제가 된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.