스마트 포인터는
RAII
resource acquisition is initialization 때문에 사용한다
이는 객체와 리소스의 life cycle을 일치시킨다는 말이다.
여기서 리소스란
같은 한정된 자원을 말한다.
객체는 스마트포인터와 같고 리소스는 heap memory와 같다.
스마트 포인터는 memory leak을 원천적으로 막아준다.

위와 같이 고양이 객체를 heap memory에 allocation시켜보면

catPtr 포인터가 heap memory에 저장한 Cat 객체를 가리킨다
이런 식으로 프로그래밍을 하다보면 실수로 heap memory에서 해제하는 delete를 빼먹어 catPtr는 사라지지만 heap memory의 Cat 객체는 사라지지않는 memory leak이 일어날 수 있다.
스마트 포인터는 stack에서 해제될 때 동시에 알아서 heap의 객체도 해제시킨다.
스마트 포인터를 사용하기 위해서는 #include <memory>를 해주어야한다.
유니크 포인터를 사용한다고 한다면
std::unique_ptr<Cat> catPtr = std::make_unique<Cat>(3);라는 식으로 할 수 있다.
이 유니크 포인터의 life cycle은 scope를 기반으로 한다.
그 말은


위와 같이 foo()라는 함수에서 스마트 포인터가 생성되면 함수가 종료 또는 stack 위의 catPtr가 pop될 때
destructor가 실행된다는 것이다.
배열의 경우에도 vector가 비슷한 역할을 한다.


만약 배열을 저장하다가 delete [] cats로 해제하는 것을 까먹는다면 memory leak이 일어난다.

벡터를 사용하면

알아서 해제된다