-
_C++_Smart_PointerProgramming/_C++ 2023. 9. 19. 17:14
C++의 raw 포인터는 강력한 수단이지만, 집중력이 조금만 흐트러지면 버그가 발생하가 쉽다.
이를 보완하기 위해 C++11에서는 스마트 포인터를 제공한다.
종류는 세 가지(네 가지 이지만, 하나는 비권장 기능)
- std::unique_ptr
- std::shared_ptr
- std::weak_ptr
1. unique_ptr
unique_ptr은 독점적 소유권을 갖는 포인터.(피지칭 객체를 가르키는 포인터가 오직 그것 하나 뿐임을 의미)
unique_ptr이 소멸될 때 피지칭 객체도 소멸됨.
이동 전용 형식으로서 복사가 불가능.
2. shared_ptr
shared_ptr은 독점적 소유권을 갖지 않는 포인터.
shared_ptr이 하나의 객체를 가리킬 수 있음. 같은 대상을 가리키는 shared_ptr들은 피지칭 객체에 대한 참조 개수 등의 정보가 포함된 제어블럭 공유.
shared_ptr이 소멸될 때 피지칭 객체를 가르키는 포인터가 자신이 유일한지 확인 후 그런 경우에만 피지칭 객체를 소멸시켜줌.
3. weak_ptr
weak_ptr은 shared_ptr처럼 작동하되 대상을 잃을 수 있는 포인터.
shared_ptr은 참조 카운팅을 통해 댕글링 포인터를 방지하지만, 엄격함이 경우에 따라 구현에 제약이 될 수 있음.
weak_ptr이 생성될 때 다른 shared_ptr을 통해 생성됨.
참조 카운트 대신 약한 참조 카운트를 조작.
객체가 소멸하더라도 약한 참조가 객체의 소멸 여부를 검사해야 하기 때문에 제어 블럭을 포한하는 메모리 공간은 해제되지 않음.
weak_ptr이 필요한 상황
- 캐싱 등 최적화를 위해 사용하는 보조적 포인터로서 객체의 수명에 관여하지 않아야 할 때.
- 옵저버 패턴 등에서 대상의 수명에 관여하지 않으면서 관찰이 필요할 때.
- shared_ptr의 순환 사이클을 방지할 때.
'Programming > _C++' 카테고리의 다른 글
_C++_Scope (0) 2023.09.20 _C++_알고리즘_Part_1 (0) 2023.09.19 C++_map (0) 2023.07.27 C++_address_pointer_reference (0) 2023.07.25 C++_function (0) 2023.07.21