Program Club

shared_ptr이 하나만 사용하는 경우 unique_ptr이 두 개의 템플릿 매개 변수를 사용하는 이유는 무엇입니까?

proclub 2020. 11. 28. 12:48
반응형

shared_ptr이 하나만 사용하는 경우 unique_ptr이 두 개의 템플릿 매개 변수를 사용하는 이유는 무엇입니까?


모두 unique_ptrshared_ptr자신이 소유 한 객체를 호출하는 사용자 정의 소멸자에 동의합니다. 그러나의 경우 unique_ptr소멸자는 클래스 의 템플릿 매개 변수로 전달되는 반면 shared_ptr사용자 지정 소멸자 의 유형은 생성자 의 템플릿 매개 변수로 지정됩니다 .

template <class T, class D = default_delete<T>> 
class unique_ptr
{
    unique_ptr(T*, D&); //simplified
    ...
};

template<class T>
class shared_ptr
{
    template<typename D>
    shared_ptr(T*, D); //simplified
    ...
};

왜 그런 차이가 있는지 모르겠습니다. 무엇이 필요합니까?


deleter를 템플릿 인수로 제공하면 (에서와 같이 unique_ptr) 유형의 일부 이며이 유형의 객체에 추가로 저장할 필요가 없습니다. deleter가 생성자의 인수로 전달되면 (에서와 같이 shared_ptr) 객체에 저장해야합니다. 동일한 유형의 개체에 대해 다른 삭제자를 사용할 수 있기 때문에 유연성이 추가됩니다.

나는 이것이 이유라고 생각한다 : unique_ptr은 오버 헤드가 전혀없는 매우 가벼운 객체 여야한다. 삭제자를 각각 저장하면 unique_ptr크기가 두 배가 될 수 있습니다. 그 때문에 사람들은 좋은 오래된 원시 포인터를 대신 사용할 것입니다.

반면에, shared_ptr참조 횟수를 저장해야하기 때문에 그다지 가볍지 않으므로 사용자 지정 삭제자를 저장하는 것도 좋은 절충안처럼 보입니다.


다른 유형 의 공유 포인터 동일한 개체 의 소유권을 공유 할 수 있습니다 . 과부하 (8)참조하십시오 std::shared_ptr::shared_ptr. 고유 포인터는 공유하지 않으므로 이러한 메커니즘이 필요 하지 않습니다 .

template< class Y > 
shared_ptr( const shared_ptr<Y>& r, element_type* ptr ) noexcept;

당신이 Deleter가 입력-삭제하지 않은 경우, 당신은 이러한을 사용할 수있게되지 않을 것 shared_ptr<T, Y_Deleter>A와 shared_ptr<T>는 기본적으로 쓸모 만들 것이다.

왜 그런 과부하를 원하십니까?

중히 여기다

struct Member {};
struct Container { Member member };

Container를 사용하는 동안 살아있는 상태로 유지하려면 Member다음을 수행 할 수 있습니다.

std::shared_ptr<Container> pContainer = /* something */
std::shared_ptr<Member> pMember(pContainer, &pContainer->member);

만 지키고있는 pMember(아마도에 넣어 std::vector<std::shared_ptr<Member>>)

또는 과부하 사용 (9)

template< class Y > 
shared_ptr( const shared_ptr<Y>& r ) noexcept; 
  // Only exists if Y* is implicitly convertible to T*

다형성 공유를 할 수 있습니다

struct Base {};
struct Derived : Base {};

void operate_on_base(std::shared_ptr<Base>);

std::shared_ptr<Derived> pDerived = /* something*/
operate_on_base(pDerived);

참고 URL : https://stackoverflow.com/questions/21355037/why-does-unique-ptr-take-two-template-parameters-when-shared-ptr-only-takes-one

반응형