exclusive ownership

unique_ptr

: 객체를 단하나의 포인터로만 가리킬수 있는 포인터,

  • 복사 생성자가 없어서 복사 불가능하다.
  • move키워드를 이용해 move는 가능하지만, 소유권이 이전된다.

    소유권이 이전된 기존의 포인터를 댕글링 포인터라고 하고, 접근하면
    컴파일에러가 발생한다.

소유권을 하나만 가지게 함으로써 얕은 복사를 방지한다.


-> 포인터로 얕은 복사 후에 두개를 할당했으니, 두개를 해제하면 컴파일에러가 발생하는 것을 확인할 수 있다.

사용하기

  • #include 헤더를 추가하자.
  • new 사용을 자제하고, make_unique를 사용하자.


: unique_ptr는 오브젝트를 2개의 포인터가 가리키는 상황을 허용치 않는다.
복사는 불간능하지만 move는 가능하다. 이때 소유권이 이전된다.

언제 쓸까?

: class에서 memeber 변수로 다른 class의 포인터를 가져야 할때 사용된다.

  • Zoo 클래스는 입력값에 따라서 Cat으로 할당할 것인지, Dog로 할당할 것인지 다르다.

    1) rule of 3에 따라서 포인터 변수인 mAnimal값은 소멸자, 복사 생성자에서 유저가 직접 관련 코드 관리를 해야만 한다.
    2) 그리고 멤버 포인터가 가리키는 오브젝트는 클래스 바깥에 있는 다른 Animal 포인터가 접근할 수있다.


    1) 더 이상 개발자가 소멸자 등을 생각할 필요가 없다.
    2) 멤버 변수인 unique_ptr가 가리키는 동물오브젝트는 오직 멤버변수인
    mAnimal만 가리킨다는 보장이 있어서? 라이프 사이클에 대해 고려할 필요가 없다.

함수의 매개변수로 사용될때

1) 레퍼런스 타입으로 unique_ptr을 사용하면, 인자로 보낸 unique_ptr은
유일한 값이 아니다. 왜냐하면 함수 내에서도 사용이 가능하므로.

2) 함수의 매개변수로 전달할때에는 주소를 받는 포인터를 사용하자.

vector에 사용할때

push_back 사용

  • push_back의 경우 복사된 객체를 벡터에 삽입하는 것이므로,
    unique_ptr을 사용하면 컴파일 에러가 발생한다.


    -> 복사 생성자가 삭제되어 있어서 오류가 발생하는 것이다.


-> move를 사용해 삽입이 가능하고, 이때는 소유권이 이전된다.

emplace_back 사용


-> unique_ptr의 복사 생성자가 없어서 불가능한 것이다.

이때는 emplace_back내에서 임시객체를 만들어 삽입하자.

-> 불필요한 이동연산을 없앨 수 있다.

profile
🔥🔥🔥

0개의 댓글