더북(TheBook)

unique_ptr<T>는 타입 T에 대한 포인터처럼 행동하며 유일해야 한다. 유일하다(unique)는 건 둘 이상의 unique_ptr<T> 객체가 같은 주소를 소유할 수 없다는 뜻이다. unique_ptr<T> 객체는 주소를 독점적으로 소유한다. unique_ptr<T> 객체를 할당하거나 복제할 수 없다. utility 헤더에 정의된 std::move() 함수를 사용해서 unique_ptr<T> 객체에 저장된 주소를 다른 unique_ptr<T> 객체로 이동할 수 있다. 이동 후에는 원래 객체가 무효화(invalid)된다. 객체에 대해 단일 소유권만 허용하고 싶을 때는 unique_ptr<T>를 사용하자.

shared_ptr<T> 객체는 타입 T에 대한 포인터처럼 행동하지만 unique_ptr<T>와는 반대로 동작한다. 공유한다(shared)는 건 같은 주소를 담은 shared_ptr<T> 객체가 얼마든지 있을 수 있다는 뜻이다. 따라서 shared_ptr<T> 객체는 자유 공간에 있는 객체 하나에 대한 소유권을 공유한다. 주소가 같은 shared_ptr<T> 객체의 개수는 기록된다. 새 shared_ptr<T> 객체가 같은 주소로 생성될 때마다 shared_ptr<T>의 레퍼런스 카운트(reference count, 참조 횟수)가 증가하고 shared_ptr<T> 객체가 소멸되거나 다른 주소가 할당되면 레퍼런스 카운트가 감소한다. 해당 주소를 가리키는 shared_ptr<T> 객체가 하나도 없으면 레퍼런스 카운트는 0이 되고 해당 주소에 객체를 위해 할당된 힙 메모리도 자동으로 해제된다. 같은 주소를 가리키는 shared_ptr<T> 객체는 몇 개가 되더라도 모두 같은 카운트에 접근할 수 있다.

weak_ptr<T>shared_ptr<T> 객체에서 생성해서 연결하고 같은 주소를 가리킨다. weak_ptr<T>를 생성해도 연결된 shared_ptr<T> 객체의 레퍼런스 카운트를 증가시키지 않는다. 따라서 weak_ptr<T>가는 객체의 소멸에 관여하지 않는다. 마지막 shared_ptr<T> 참조가 소멸하거나 다른 주소로 재할당될 때 shared_ptr<T>의 메모리는 해제되더라도 연관된 weak_ptr<T> 객체는 남아 있게 된다.

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