더북(TheBook)

스마트 포인터에는 두 가지 기본 타입, unique_ptr<T>shared_ptr<T>가 있다. unique_ptr는 가리키는 대상에 대해 독점적인 소유권을 갖지만 shared_ptr는 여러 포인터가 같은 객체를 가리킬 수 있다. 또한, shared_ptr<T>에서 생성하는 스마트 포인터인 weak_ptr<T> 타입도 있다. weak_ptr<T> 타입은 shared_ptr 여러 개가 일으킬 수 있는 순환 참조 문제를 피하고자 사용된다. unique_ptr<T> 타입의 포인터도 포인터를 이동하는 방식으로 컨테이너에 저장할 수 있다. 예를 들어 다음 코드는 컴파일 문제가 없다.

std::vector<std::unique_ptr<std::string>> words;
words.push_back(std::make_unique<std::string>("one"));
words.push_back(std::make_unique<std::string>("two"));

vectorunique_ptr<string> 타입의 스마트 포인터를 저장하고 있다. make_unique<T>() 함수로 객체와 스마트 포인터를 한 번에 만들고, 스마트 포인터를 반환한다. 결과가 unique_ptr<string> 임시 객체이므로 push_back() 함수는 우측값 참조 매개변수 버전이 호출된다. 따라서 복제가 필요 없다. unique_ptr 객체를 추가하는 다른 방법은 unique_ptr 로컬 변수를 만들고, std::move()를 사용해 이 로컬 변수를 컨테이너 안으로 옮기는 것이다. 하지만 컨테이너의 원소 복제가 필요한 후속 연산들은 실패하게 된다. 오직 하나만 있을 수 있다. 원소들을 복제해야 한다면 shared_ptr 객체가 해법이 될 수 있다. 복제가 필요 없다면 unique_ptr 객체를 사용해라.

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