본문 바로가기
스터디/C++

[ C++ ] 스마트 포인터 ( Smart Pointer )

by 알 수 없는 사용자 2019. 11. 28.

스마트 포인터는 말 그대로 똑똑한 포인터라는 뜻이다.

사실 스마트 포인터는 객체인데, 포인터의 역할을 하는 객체를 뜻한다.

 

그럼 스마트 포인터란 무엇일까?

 

일단 포인터를 다시 살펴보자.

포인터는 메모리 주소를 저장하는 변수이다.

하지만 포인터는 단점이 있는데, 바로 new 연산자를 이용해서 동적 할당을 하게 되면

delete 연산자를 통해서 메모리 해제를 시켜줘야 한다는 점이다. ( 하지 않으면 메모리 누수가 발생한다. )

 

이런 단점을 보완하여 생겨난 것이 스마트 포인터이다.

즉, delete 연산이 자동으로 일어난다는 점이다. 

 

예제를 살펴보자

 

점 클래스

먼저 점에 대한 클래스이다. << 연산자 오버 로딩을 해서 점의 좌표 값 출력을 원활하게 하였다.

 

스마트 포인터 클래스

스마트 포인터 클래스이다. 

스마트 포인터의 가장 기본적으로 * 연산자와 -> 연산자의 오버 로딩이 되어있다.

스마트 포인터는 포인터처럼 동작하는 객체이기 때문에, 두 연산자의 정의는 필수이다.

 

생성자의 인자로 전달되는 주소 값은, new 연산에 의해서 동적 할당된 객체의 주소 값이라는 가정이 포함되어있다.

 

결과는 다음과 같다.

즉, 스마트 포인터를 이용해서 동적 할당을 하면 delete 연산이 자동으로 이뤄진다.

 

만약 그냥 포인터를 이용하여 동적할당을 하게 되면

delete 연산이 자동으로 일어나지 않기 때문에 따로 메모리 해제를 해야 한다.

 

개발자도 사람이기 때문에 모든 메모리를 해제하기 어려울 수 있고, 찾기가 힘들기 때문에 스마트 포인터가 유용할 수 있습니다.

 

하지만 스마트 포인터가 장점만 있는 것은 아니기에 의존하면 안 됩니다.

 

일단 정적으로 선언된 포인터 값이 NULL인지 아닌지 체크가 불가능하고, 디버깅과 유지보수가 어렵기 때문에 상황을 잘 판단하고 사용하는 것을 권합니다.

 

 

 

스마트 포인터는 보통 개인적으로 구현해서 사용하지 않고 C++에서 제공해주는 스마트 포인터를 사용합니다.

C++11부터는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공합니다.

 

현재까지 C++ 표준 라이브러리에서 제공이 되고 있는 스마트 포인터는 총 3개입니다. (2019. 11. 19 기준)

 

unique_ptr하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록, 객체에 소유권 개념을 도입한 스마트 포인터입니다.

 

shared_ptr은 하나의 특정 객체를 참조하는 스마트 포인터가 총 몇 개인지를 참조하는 스마트 포인터입니다.

 

weak_ptr은 하나 이상의 shared_ptr 인스턴스가 소유하는 객체에 대한 접근을 제공하지만, 소유자의 수에는 포함되지 않는 스마트 포인터입니다.

 

보통의 C++ 객체에 대해 스마트 포인터가 필요한 상황에서는 주로 unique_ptr을 사용합니다.

 

자세한 사항은 https://docs.microsoft.com/ko-kr/cpp/cpp/smart-pointers-modern-cpp?view=vs-2019를 참고하세요.