Smart Pointer(스마트 포인터)란?

STL 에서 smart pointer 는 무엇이고, 어떤 종류의 smart pointer 가 있는지 간단히 알아보자.


Smart Pointer

C++ 언어에서 흔히 말하는 포인터는 변수의 주소만 담기 때문에 원시 포인터(raw pointer) 라고 한다. 반면, 스마트 포인터는 원시 포인터를 모방한 템플릿 타입의 객체이므로 원시 포인터처럼 주소를 담고 사용할 수 있지만, 두 가지 큰 차이점이 있다. 첫 번째는 스마트 포인터는 동적 할당된 메모리의 주소만 저장할 수 있다는 것이다. 둘 째는 원시 포인터에서 하던 증가, 감소와 같은 산술 연산을 할 수 없다는 것이다.

불편해보이지만 원시 포인터를 사용하는 것보다 스마트 포인터를 사용하는 것이 훨씬 좋다. 스마트 포인터를 사용하면 할당된 메모리를 해제하는 것을 더 이상 신경 쓸 필요가 없기 때문이다. 따라서 메모리 누수가 발생하는 것을 피할 수 있게 해준다.


3가지 종류

std 네임스페이스에는 3가지 스마트 포인터가 정의되어 있다.

  • unique_ptr<T>는 둘 이상의 unique_ptr<T>객체가 같은 주소를 소유할 수 없다. unique_ptr<T> 는 주소를 독점적으로 소유하기 때문에 unique_ptr<T> 개체를 할당하거나 복제할 수 없다. 물론, std::move() 함수를 사용해서 다른 unique_ptr<T> 객체로 이동할 수 있지만, 이동 후에는 원래의 객체는 무효화 된다.
  • shared_ptr<T>는 unique_ptr<T>와 반대로 동작한다. 같은 주소를 담은 shared_ptr<T> 객체가 얼마든지 있을 수 있다. 따라서 shared_ptr<T> 객체는 객체 하나에 대한 소유권을 공유한다. shared_ptr<T> 에는 레퍼런스라는 것이 있는데, 새 shared_ptr<T> 객체가 같은 주소로 생성될 때 마다 shared_ptr<T>의 레퍼런스 카운트가 증가하고, shared_ptr<T>가 소멸되거나 다른 주소가 할당되면 레퍼런스 카운트가 감소한다. 해당 주소를 가리키는 shraed_ptr<T> 객체가 하나도 없으면 레퍼런스 카운트는 0이 되고 해당 주소에 객체를 위해 할당된 힙 메모리도 자동으로 해제된다.
  • weeak_ptr<T>는 shared_ptr<T> 객체에서 생성해서 연결하고 같은 주소를 가리킨다. weak_ptr<T>를 생성해도 연결된 shared_ptr<T> 객체의 레퍼런스 카운트는 증가하지 않는다. 따라서, shared_ptr<T>의 메모리는 해제되더라도 연관된 week_ptr<T> 객체는 남아 있게 된다. weak_ptr<T> 가 필요한 이유는 두 개의 shared_ptr<T> 객체가 서로를 가리키면 순환 참조가 되기 때문에 결코 소멸되지 않기 때문에 이런 문제를 피하기 위한 것이다.




Reply