[C++] 스마트 포인터(Smart Pointer)

kimyb·2023년 2월 12일

스마트 포인터는 동적으로 할당된 메모리 관리를 해줄 수 있다. 메모리 누수(memory leak) 같은 문제를 방지 할 수 있다.

스마트 포인터 종류의 3가지.

  1. std::shared_ptr

    • 여러 스마트 포인터 객체가 하나의 동적 할당된 메모리를 공유할 수 있다.
      이 객체는 참조 카운트(reference count)를 유지하며, 해당 메모리를 참조하는 모든 shared_ptr 객체가 파괴될 때마다 참조 카운트가 감소하며, 참조 카운트가 0이 되면 메모리가 자동으로 해제된다.

    • 순환 참조(circular reference) 문제를 야기할 수 있어, 주의가 필요합니다.
      (순환참조를 해결하기 위해서 weak_ptr를 사용할 수도 있다).

  2. std::unique_ptr

    • 메모리를 오직 하나의 스마트 포인터만 소유할 수 있는 포인터입니다. 복사나 이동 연산이 금지되어 소유권을 안전하게 전달하거나 반환할 수 있으며, 메모리는 unique_ptr 객체와 함께 파괴된다.

    • 메모리의 고유 소유권을 추적하고, 복사나 이동으로 인한 문제를 방지할 수 있다. 무결성을 유지할 때 유용.

    • 복사나 이동이 불가능하기 때문에 메모리 공유가 불가능하며, 다른 스마트 포인터와 함께 사용할 때 주의해야 함.

  3. std::weak_ptr

    • weak_ptrshared_ptr와 함께 사용되며, 메모리를 공유하지 않고 객체의 수명을 연장하지 않고,
      shared_ptr가 메모리를 참조하고 있는 동안에만 weak_ptr로 메모리를 참조할 수 있다.

    • weak_ptr은 순환 참조를 방지하면서, 메모리를 안전하게 참조할 수 있다.
      weak_ptrshared_ptr로부터 생성되었더라도, weak_ptr가 파괴되거나 shared_ptr로 변환되지 않는 한, 메모리 해제를 유발하지 않는다.

    • weak_ptr로 직접 메모리를 사용하려면 lock() 함수를 사용하여 shared_ptr로 변환해야 한다.
      !!!!lock()을 사용하여 weak_ptr를 직접 사용하면, 이미 파괴된 메모리를 참조할때 nullptr를 반환하므로 유효성을 검사할 수 있다.!!!!

다음은 스마트 포인터를 구현해보자.

profile
공부했던것을 정리.

0개의 댓글