[C++] 유니크(Unique) 포인터

Date:     Updated:

카테고리:

태그:

이 글은 C++ 유니크(Unique) 포인터를 공부하고 정리한 글입니다.
유니크 포인터는 소유자가 하나밖에 없는 포인터이다.

유니크(Unique) 포인터

  • 포인터를 단독으로 소유
  • 소유한 포인터를 누구하고도 공유하지 않음
  • 따라서 복사나 대입 불가
  • unique_ptr가 범위를 벗어날 때, 포인터가 지워짐(delete)

    코드 예제

    #include <memory>
    
    int main()
    {
        std::unique_ptr<int[]> myArray1(new int[](40));                   // C++11
        std::unique_ptr<int[]> myArray2 = std::make_unique<int[]>(40);    // C++14 이후
    
    }
    

    reset()

    • 포인터를 교체한다
    • std::unique_ptr가 재설정될 때, 소유하고 있던 원시 포인터는 자동으로 소멸됨
    std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f);
    vector.reset(new Vector(20.f, 40.f)); // 기존에 가지고 있던 포인터를 해제하고 새로운 포인터를 연결해준다
    vector.reset();   // 가지고 있던 포인터를 해제한다
    vector = nullptr; // 가지고 있던 포인터를 해제한다
    

    get()

    • 포인터를 반환한다
    • 다만, 포인터에 대한 소유권을 박탈하는 것은 아니다
    std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f);
    Vector* ptr = vector.get();   // 10.f 30.f
    

    release()

    • 포인터에 대한 소유권을 박탈하고 포인터를 반환한다
    • release() 호출 후 get()을 호출하면 nullptr가 반환됨
    std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f);
    Vector* ptr1 = vector.release();  // 10.f 30.f
    Vector* ptr2 = vector.get();      // nullptr
    

    소유권 이전하기

    • std::unique_ptr는 소유한 포인터를 아무하고도 공유하지 않음
    • 즉, 주소 복사를 하지 않는다는 뜻
    • 대신, 소유권을 다른 std::unique_ptr로 옮길 수 있음
    • 예외 : const std::unique_ptr
    std::vector<std::unique_ptr<Player>> players;
    
    std::unique_ptr<Player> coco = std::make_unique<Player>("Coco");
    players.push_back(std::move(coco));
    
    std::unique_ptr<Player> lulu = std::make_unique<Player>("Lulu");
    players.push_back(std::move(lulu));
    

    move()

    • 개체 A의 모든 멤버를 포기하고 그 소유권을 B에게 주는 방법
    • 메모리 할당과 해제가 일어나지 않음
      관련 글 보러가기

적합한 경우

  • 클래스에서 생성자/소멸자
    • unique_ptr을 사용 할 경우 소멸자에서 delete를 할 필요가 없어진다
  • 지역 변수에서 동적 할당할 때
    • 실수나 return으로 인해 delete를 못할 때 알아서 메모리 해제(delete)를 해준다
  • STL 벡터에 포인터 저장할 때
    • myVector.clear() 할 시 안에 있는 메모리들을 unique_ptr이 해제해준다


참조

포큐아카데미 C++ 언매니지드 프로그래밍



💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우 
  언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기