-
Smart PointerC++ 2022. 7. 17. 23:18
변수선언에는 크게 정적할당과 동적할당으로 나뉩니다.
정적할당은 프로그램을 실행하기 전 미리 선언되어있는 변수를 컴파일러에게 알려준 후 메모리 공간을 확보하는 것입니다. 이렇게 할당된 변수들은 스택 메모리에 쌓이고요.
동적할당은 프로그램을 실행하는 중에 변수를 만드는겁니다. 정적할당과 달리 미리 확보된 공간도 없으며 프로그램 실행 도중에 확보해야 합니다. 이렇게 생기게된 변수는 힙 메모리에 쌓이게 됩니다.
힙 메모리는 마치 프로그래머의 도화지 같은 곳입니다. 프로그래머가 마음대로 메모리를 할당하고 데이터를 다룰 수 있죠. 하지만 그만큼의 책임도 따릅니다. 프로그램이 꺼지기 전에 delete함수를 통해 동적할당된 메모리 영역을 해제해줘야 하기 때문이죠.
Smart Pointer는 delete과정이 없어도 수명이 다하면 자동으로 메모리를 해제해준다는 장점이 있습니다. class 형식이지만 기존 포인터와 동일한 방법으로 사용할 수 있다는 편의성도 있습니다.
1. unique_ptr
unique는 유일무이한.. 이라는 뜻을 가지고 있습니다. unique_ptr 포인터는 다른 unique_ptr 변수에 복사할 수 없다는 특징을 가지고 있습니다. 오직 어떤 변수를 가리키는 포인터는 자기자신뿐이라는 뜻이 되는것이죠. 하지만 그렇다고해서 다른 포인터가 그 변수를 가리키는 방법이 아예 없는것은 아닙니다.
move함수를 통해 다른 unique_ptr도 기존 unique_ptr이 가리키던 변수를 가리킬 순 있지만 기존 unique_ptr은 더이상 아무것도 가리키게 되지 않게됩니다.
2. shared_ptr
unique_ptr과 반대로 하나의 변수에 대해 여러 포인터들이 참조할 수 있습니다. 사실상 일반 포인터와 다르지 않은 특징이죠. 그래도 메모리 해제를 자동으로 해주기 때문에 편리한 부분입니다만 이 포인터의 특징은 하나의 메모리 위치를 가리키는 포인터의 개수를 알 수 있습니다.
3. weak_ptr
weak_ptr은 하나 이상의 shared_ptr가 가리키는 객체를 참조할수 있지만 reference count를 늘리지않는 스마트 포인터이다. shared_ptr을 사용할때 발생할 수 있는 문제를 해결하기 위해 사용된다.
shared_ptr은 하나의 객체를 여러 스마트 포인터가 가리키고 reference count를 통해 동작한다. 그런데 만약 서로가 서로를 가리키는 shared_ptr을 가지게 되면 reference count가 0이 될 수가 없으므로 메모리가 해제되지 않는 순환 참조(circular reference)가 발생하게 된다. weak_ptr은 이러한 순환 참조를 제거하기 위해 사용된다.