본문 바로가기

[C++] 스마트 포인터

Kwonriver 2022. 1. 8.
728x90

스마트 포인터

포인터는 많은 오류의 원인이 되기 쉽다.

가장 큰 이유는 메모리의 해제 때문인데 코딩 공부 초장기에 많이 겪어봤을 것이다.

이런 문제를 회피하기 위해 스마트 포인터가 등장했다.

스마트 포인터를 사용하더라도 포인터를 잘못 사용하거나 이상한 일이 생길 수 있으므로 너무 믿지 말자.

 

모든 스마트 포인터는 <memory> 헤더에 정의되어 있다.

 

C++11부터 2가지의 스마트 포인터가 제동된다.

 

shared_ptr 

공유 소유권(shared ownership)이라는 개념을 구현한다.

여러 스마트 포인터가 동일한 객체를 참조할 수 있다.

때문에 객체와 그 객체가 가진 자원은 객체에 대한 마지막 포인터가 소멸될 때 같이 소멸된다.

즉, 객체를 가리키고 있는 포인터가 하나도 없을 때 소멸된다.

 

unique_ptr 

베타 소유권(exclusive ownership)이라는 개념을 구현한다.

이 포인터는 해당 객체를 참조하는 스마트 포인터가 한 번에 하나만 존재한다고 가정한다.

즉, 객체를 가리키고 있는 스마트포인터는 1개만 존재한다.

대신 소유권을 전달할 수 있다.

이 포인터는 new로 생성한 후 예외가 발생하여 delete를 하지 못하는 상황에서 메모리 누수를 막는데 유용하다.

 

 

C++11에서 두 개의 스마트 포인터를 제공하는 이유는 성능 차이에 있다.

shared_ptr은 하나의 객체를 여러개의 포인터가 가리킬 수 있으며 가리키고 있는 포인터들을 참조하고 있어야 한다.

그래야 객체를 가리키고 있는 포인터가 몇 개인지 알 수 있을테니까.

따라서 내부적으로 다른 도우미 객체들이 필요하다,

이는 몇가지 특정 최적화를 적용할 수 없게 되고 성능상 떨어지게 된다.

unique_ptr은 이런 부하가 없으며 특별한 생성자,소멸자를 사용하며 복사 문맥을 제거했기 때문에 더욱 스마트하다.

 

스마트 포인터는 완벽한 포인터가 아니다.

너무 스마트 포인터에 의존하여 메모리 누수를 방지 하지 말고 유심히 잘 생각하여 설계하자.

 

728x90