IT story

unique_ptr과 shared_ptr의 차이점

hot-time 2020. 4. 25. 09:54
반응형

unique_ptr과 shared_ptr의 차이점


가능한 중복 :
pimpl : shared_ptr 또는 unique_ptr
스마트 포인터 (부스트) 설명

누군가 shared_ptr과 unique_ptr의 차이점을 설명 할 수 있습니까?


이 두 클래스는 모두 스마트 포인터이므로, 대부분의 경우 해당 객체를 더 이상 참조 할 수없는 시점을 가리키는 객체를 자동으로 할당 해제합니다. 이 둘의 차이점은 각 유형의 여러 포인터가 자원을 참조 할 수있는 수입니다.

를 사용할 때 하나의 리소스를 가리키는 unique_ptr최대 하나가있을 수 있습니다 unique_ptr. 그이 때 unique_ptr파괴, 자원이 자동으로 재생됩니다. unique_ptr리소스 는 하나만있을 수 있으므로 a를 복사하려고 unique_ptr하면 컴파일 타임 오류가 발생합니다. 예를 들어,이 코드는 불법입니다 :

unique_ptr<T> myPtr(new T);       // Okay
unique_ptr<T> myOtherPtr = myPtr; // Error: Can't copy unique_ptr

그러나 새로운 이동 의미론을 사용하여 이동할unique_ptr 수 있습니다 .

unique_ptr<T> myPtr(new T);                  // Okay
unique_ptr<T> myOtherPtr = std::move(myPtr); // Okay, resource now stored in myOtherPtr

마찬가지로 다음과 같이 할 수 있습니다.

unique_ptr<T> MyFunction() {
    unique_ptr<T> myPtr(/* ... */);

    /* ... */

    return myPtr;
}

이 관용구는 "관리 대상 리소스를 반환하고 있습니다. 반환 값을 명시 적으로 캡처하지 않으면 리소스가 정리됩니다. 그렇지 않으면 해당 리소스에 대한 독점 소유권이 있습니다." 이런 식 unique_ptr으로을보다 안전하고 더 나은 대체물로 생각할 수 있습니다 auto_ptr.

shared_ptr반면에 여러 포인터가 주어진 자원을 가리 키도록 허용합니다. shared_ptr자원의 마지막 부분 이 파괴되면 자원이 할당 해제됩니다. 예를 들어이 코드는 완벽하게 합법적입니다.

shared_ptr<T> myPtr(new T);       // Okay
shared_ptr<T> myOtherPtr = myPtr; // Sure!  Now have two pointers to the resource.

내부적으로 참조 횟수shared_ptr사용 하여 리소스를 가리키는 포인터 를 추적하므로 참조주기를 도입하지 않도록주의해야합니다.

한마디로 :

  1. unique_ptr단일 포인터가 파괴 될 때 회수 될 객체에 대한 단일 포인터를 원할 때 사용하십시오 .
  2. shared_ptr동일한 자원에 대한 여러 포인터를 원할 때 사용하십시오 .

도움이 되었기를 바랍니다!


unique_ptr그냥하는 동적 객체 곳이 있다면 선택의 경량 스마트 포인터는 하나 개의 요구 사항이 일부 동적으로 할당 된 객체를 유지하는 것이 어쩌면 래퍼 클래스 - 소비자가 유일한 (따라서 "독특한") 책임이 있습니다. unique_ptr오버 헤드가 거의 없습니다. 복사 할 수는 없지만 움직일 수 있습니다. 그것의 유형 이다 template <typename D, typename Deleter> class unique_ptr;가에 달려 있으므로, 두 개의 템플릿 매개 변수.

unique_ptr또한 auto_ptr이전 C ++에 있기를 원했지만 해당 언어의 한계로 인해 불가능했습니다.

shared_ptr반면에 아주 다른 동물입니다. 명백한 차이점은 많은 소비자가 동적 객체 (따라서 "공유")에 대한 책임을 공유 할 수 있고 모든 공유 포인터가 사라지면 객체가 파괴된다는 것입니다. 또한 약한 포인터관찰 할 수 있으며 추적 하는 공유 포인터가 사라지면 지능적으로 알려줍니다.

내부적 shared_ptr으로 훨씬 더 많은 일이 있습니다. 참조 카운트가 있으며, 동시 코드에서 사용할 수 있도록 원자 적으로 업데이트됩니다. 또한 내부 부기 "참조 제어 블록"에 대한 할당과 실제 구성원 개체에 대한 할당이 많이 있습니다.

공유 포인터 유형이 :하지만 거기에 또 다른 큰 차이가있어 항상 template <typename T> class shared_ptr; , 이것은 사용자 정의 deleters로 초기화 할 수 있다는 사실에도 불구하고 사용자 정의 할당 자와. 삭제 자와 할당자는 클래스의 내부 가중치에 추가되는 유형 삭제 및 가상 함수 디스패치를 ​​사용하여 추적되지만 T삭제 및 할당 세부 사항에 관계없이 유형의 공유 포인터 유형 이 모두 호환 된다는 엄청난 이점이 있습니다. 따라서 그들은 T소비자들에게 세부 사항에 부담을주지 않으면 서 "공유 책임"이라는 개념을 진정으로 표현합니다 !

둘 다 shared_ptrunique_ptr(고유 포인터에 대한 명백한 이동성의 요구 사항) 값에 의해 전달 될 수 있도록 설계되었습니다. 그들의 힘이 정말 놀랍기 때문에 오버 헤드에 대해 걱정하지 않아도되지만, 선택의 여지가 있다면 선호 unique_ptr하고 shared_ptr공유 책임이 필요한 경우 에만 사용 하십시오.


unique_ptr
은 객체를 독점적으로 소유하는 스마트 포인터입니다.

shared_ptr
은 공유 소유권에 대한 스마트 포인터입니다. 그것은 둘 다 copyablemovable. 여러 스마트 포인터 인스턴스가 동일한 리소스를 소유 할 수 있습니다. 리소스를 소유 한 마지막 스마트 포인터가 범위를 벗어나면 리소스가 해제됩니다.


에 포인터를 줄 바꿈하면 unique_ptr여러 개의 사본을 가질 수 없습니다 unique_ptr. shared_ptr저장된 포인터의 매수를 카운트하는 기준 카운터를 보유하고있다. a shared_ptr를 복사 할 때 마다이 카운터가 증가합니다. a shared_ptr가 파괴 될 때 마다이 카운터는 감소합니다. 이 카운터가 0에 도달하면 저장된 객체가 파괴됩니다.

참고 URL : https://stackoverflow.com/questions/6876751/differences-between-unique-ptr-and-shared-ptr

반응형