ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • _C++_Smart_Pointer
    Programming/_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이 필요한 상황

    1. 캐싱 등 최적화를 위해 사용하는 보조적 포인터로서 객체의 수명에 관여하지 않아야 할 때.
    2. 옵저버 패턴 등에서 대상의 수명에 관여하지 않으면서 관찰이 필요할 때.
    3. 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
Designed by Tistory.