C/C++ 스마트 포인터 간단 정리
스마트 포인터
C++ 프로그램에서 동적할당 된 메모리는, 반드시 delete를 통해서 메모리 해제가 이루어져야 합니다.
C++에서 메모리 누수로부터 프로그램의 안정적으로 관리할 수 있도록
스마트 포인터를 제공하고 있습니다.
이 스마트 포인터는 RAII의 개념을 기반으로 제작되었으며,
클래스 템플릿으로 구현되어 있습니다.
포인터 처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해주고,
Dangling 포인터, 할당 실패 등의 버그를 방지하도록 제작되었습니다.
이러한 스마트 포인터의 사용 이유는,
스마트 포인터를 사용함으로써,
new, delete와 같은 키워드를 사용하는 추가적인 코드를 줄일 수 있으며,
RAII 개념을 기반으로 제작되었기 때문에,
제작의도에 맞게 사용자가 메모리 관리를 할 때 좀 더 안전하게 사용할 수 있다는 점이 가장 큰 장점입니다.
이러한 스마트 포인터의 종류로는
유니크 포인터, 쉐어드 포인터, 위크드 포인터 이렇게 세 가지가 있습니다.
유니크 포인터는 다른 두 스마트 포인터와 달리
유니크 포인터가 가지고 있는 주소지는 다른 포인터가 참조할 수 없다는 것이 큰 특징입니다.
객체의 유일한 소유권을 가지고 있도록 제작되었기 때문에
복사 생성자가 명시적으로 삭제되어 있습니다.
하지만 소유권 이전은 허용되어 있습니다.
쉐어드 포인터는
참조 카운트를 통해 관리되는 스마트 포인터입니다.
자원의 주소가 여러번 참조되는 구조를 가질 때 사용하도록 설계되었습니다.
참조 카운트는 쉐어드 포인터의 생성자가 호출 될 때 1씩 추가되며,
자원이 소멸될 때, 1씩 감소됩니다.
쉐어드 포인터는 서로가 서로를 참조할 수 있기에 순환참조 구조를 가질 수 있습니다.
이러한 순환 참조의 구조를 해소하기 위해 사용할 수 있는 것이,
위크드 포인터 입니다.
https://woo-dev.tistory.com/111
[C++] 스마트 포인터에 대해 알아보자(2) | 공유 포인터 | std::shared_ptr
유니크 포인터와 참조 카운팅에 대해 모른다면 다음 포스팅을 보고오는 걸 추천한다. 참조 카운팅 https://woo-dev.tistory.com/61 유니크 포인터 https://woo-dev.tistory.com/110 [유니크 포인터의 단점] 먼저 저
woo-dev.tistory.com
-> 참고블로그
위크드 포인터는 상호 참조가 가능하지만
참조 카운터를 늘리지 않는 것이 특징입니다.
제어 블록에는 몇 개의 shared_ptr 가 가리키고 있는지를 나타내는 참조 카운터가 있으며,
그리고 참조 개수가 0 이 되면 해당 객체를 메모리에서 해제합니다.
그렇다고 참조 개수가 0 이 될때 제어 블록 역시 메모리에서 해제하지 않는 경우가 있습니다.
만약에 가리키는 shared_ptr 은 0 개 지만 아직 weak_ptr 가 남아있고,
물론 이 상태에서는 이미 객체는 해제 되어 있을 것입니다.
하지만 제어 블록 마저 해제해 버린다면,
제어 블록에서 참조 카운트가 0 이라는 사실을 알 수 없게 됩니다.
메모리가 해제된 이후에,
같은 자리가 다른 용도로 할당 될 수 있습니다.
이 때문에 참조 카운트 위치에 있는 메모리가 다른 값으로 덮어 씌어질 수 도 있습니다
즉, 제어 블록을 메모리에서 해제해야 하기 위해서는 이를
가리키는 weak_ptr 역시 0 개여야 합니다.
따라서 제어 블록에는 참조 개수와 더불어 약한 참조 개수 (weak count) 기록하게 됩니다.