unique_ptr과 shared_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
사용 하여 리소스를 가리키는 포인터 수 를 추적하므로 참조주기를 도입하지 않도록주의해야합니다.
한마디로 :
unique_ptr
단일 포인터가 파괴 될 때 회수 될 객체에 대한 단일 포인터를 원할 때 사용하십시오 .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_ptr
와 unique_ptr
(고유 포인터에 대한 명백한 이동성의 요구 사항) 값에 의해 전달 될 수 있도록 설계되었습니다. 그들의 힘이 정말 놀랍기 때문에 오버 헤드에 대해 걱정하지 않아도되지만, 선택의 여지가 있다면 선호 unique_ptr
하고 shared_ptr
공유 책임이 필요한 경우 에만 사용 하십시오.
unique_ptr
은 객체를 독점적으로 소유하는 스마트 포인터입니다.
shared_ptr
은 공유 소유권에 대한 스마트 포인터입니다. 그것은 둘 다 copyable
와 movable
. 여러 스마트 포인터 인스턴스가 동일한 리소스를 소유 할 수 있습니다. 리소스를 소유 한 마지막 스마트 포인터가 범위를 벗어나면 리소스가 해제됩니다.
에 포인터를 줄 바꿈하면 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
'IT story' 카테고리의 다른 글
힘내, 원산지 / 마스터를 커밋으로 재설정하는 방법? (0) | 2020.04.25 |
---|---|
상황에 따라 레이아웃 팽창기를 얻는 방법? (0) | 2020.04.25 |
PHP를 사용하여 XML 파일을 동적으로 생성하는 방법은 무엇입니까? (0) | 2020.04.25 |
입력 크기 대 너비 (0) | 2020.04.24 |
파이썬의 트위스트에 대한 깨끗하고 가벼운 대안? (0) | 2020.04.24 |