더북(TheBook)

1.6.1 unique_ptr<T> 포인터 사용하기

unique_ptr<T> 객체는 주소 하나를 유일하게 저장할 수 있다. 따라서 주소가 가리키는 객체를 unique_ptr<T> 객체가 독점적으로 소유한다. unique_ptr<T> 객체가 소멸될 때 해당 객체도 같이 소멸된다. 스마트 포인터를 여러 개 둘 필요가 없고 소유권을 하나로 정해두고 싶을 때 이러한 유형의 스마트 포인터를 적용한다. unique_ptr<T>가 소유한 객체는 원시 포인터를 이용해서 객체에 대한 접근을 허용할 수 있다. 생성자를 사용해서 어떻게 unique_ptr<T>를 생성하는지 보자.

std::unique_ptr<std::string> pname {new std::string {"Algernon"}};

힙에 생성된 string 객체가 unique_ptr<string> 생성자에 전달된다. 기본 생성자는 unique_ptr<T> 객체의 내부 원시 포인터를 nullptr로 생성한다.

unique_ptr<T> 객체를 생성하는 훨씬 더 좋은 방법은 memory 헤더에 정의된 make_unique<T>() 함수 템플릿을 사용하는 것이다.

auto pname = std::make_unique<std::string>("Algernon");

make_unique<T>() 함수는 인수를 클래스 생성자에 전달해서 힙에 string 객체를 생성하고, 생성한 string 객체의 유니크 포인터(unique pointer)를 반환한다. make_unique<T>() 함수에는 T 생성자에 필요한 인수를 얼마든지 쓸 수 있다. 예제를 보자.

auto pstr = std::make_unique<std::string>(6, '*');

string 생성자에 전달된 인수가 두 개이므로 "******"을 갖는 객체가 생성된다.

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