더북(TheBook)

1.6 | 스마트 포인터

 

C++ 언어의 포인터는 포인터 타입의 변수에 주소만 담기 때문에 원시 포인터(raw pointer)라고 한다. 즉, 원시 포인터에는 자동 변수, 정적 변수, 힙에 생성된 변수의 주소만 담을 수 있다. 스마트 포인터는 원시 포인터를 모방한 템플릿 타입의 객체이므로 원시 포인터처럼 주소를 담고 사용할 수 있지만, 두 가지 큰 차이점이 있다.

스마트 포인터는 자유 공간에 할당된 메모리의 주소만 저장할 수 있다.

원시 포인터에서 하던 증가, 감소 같은 산술 연산은 스마트 포인터에서 할 수 없다.

자유 공간(free store)****에 생성된 객체에는 원시 포인터보단 스마트 포인터를 사용하는 것이 훨씬 더 좋다. 스마트 포인터를 사용하면 객체가 더는 필요하지 않을 때 객체에 할당된 메모리가 자동으로 해제되므로 힙 메모리를 해제하기 위해 언제 delete를 사용할지 고민하지 않아도 된다는 엄청난 장점이 있다. 다시 말하면 메모리 누수가 발생할 가능성을 제거해버린다.

스마트 포인터를 컨테이너에 저장할 수도 있는데, 이는 클래스 타입의 객체로 작업할 때 특히 유용하다. 객체가 아니라 포인터를 저장하면 다형성 행위를 유지할 수 있다. 예를 들어 스마트 포인터에 기반 클래스 타입을 템플릿 타입 인수로 사용한다면 파생 클래스 타입의 객체를 가리키는 데 스마트 포인터를 사용할 수 있다. 스마트 포인터 타입을 위한 템플릿은 memory 헤더에 정의되어 있으므로 스마트 포인터를 사용하려면 소스 파일에 memory 헤더를 포함해야 한다. std 네임스페이스에 세 가지 스마트 포인터가 정의되어 있다.

**** 역주

허브 서터가 <Exceptional C++>에서 설명한 방식을 따르면 new/delete로 할당/해제하는 동적 메모리 공간을 자유 공간(free store)이라 하고, malloc/free로 할당/해제하는 동적 메모리 공간을 힙(heap)이라고 한다. 이런 이유로 동적 메모리 공간(힙 또는 자유 공간)이라는 표현을 자주 볼 수 있다. C++ 표준안에는 자유 공간(free store)만 쓰이고 힙(heap)이라는 표현은 쓰이지 않는다.

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