>백엔드 개발 >C++ >`shared_ptr`은 `Base`의 가상 소멸자 없이 `파생` 객체를 관리할 수 있습니까?

`shared_ptr`은 `Base`의 가상 소멸자 없이 `파생` 객체를 관리할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-09 20:53:10458검색

Can `shared_ptr` Manage `Derived` Objects Without a Virtual Destructor in `Base`?

가상 소멸자가 없는 Shared_Ptr 및 다형성

최근 토론에서 Daniel Lidström은 shared_ptr new Derived로 생성된 경우 Base에 가상 소멸자가 필요하지 않습니다. 이 기사에서는 이러한 구현의 타당성을 조사합니다.

가상 소멸자 없이 Shared_Ptr 구현

이 구현의 핵심은 유형 삭제에 있습니다. Shared_ptr은 단순한 참조 카운터 이상의 것을 저장합니다. 여기에는 객체 파괴를 처리하는 삭제자(데이터 구조의 일부로 저장됨)가 포함됩니다. 이 삭제자는 모든 유형이 될 수 있으므로 T(shared_ptr의 템플릿 유형) 범위를 넘어서는 사용자 정의가 가능합니다.

파생 클래스에 대한 사용자 정의

shared_ptr을 생성할 때< ;베이스> Derived 객체에서 템플릿 기반 생성자가 호출되어 구체적인 유형 Derived를 지정할 수 있습니다. 생성자는 동적 유형에 대한 지식을 바탕으로 필요한 삭제자를 생성하여 Base에 가상 소멸자가 없어도 적절한 객체 소멸을 보장합니다.

구현 예

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};

위 내용 생성자를 사용하면 shared_ptr 파생 객체에서.

C 11 표준 요구 사항

C 11 표준에서는 명시적으로 다음 동작을 요구합니다.

  • 템플릿 생성자는 다음을 보장해야 합니다. delete p 표현식은 가상 소멸자가 없어도 잘 정의된 동작을 가집니다. T.
  • shared_ptr이 삭제자 없이 객체를 소유한 경우 delete p를 호출해야 합니다.

위 내용은 `shared_ptr`은 `Base`의 가상 소멸자 없이 `파생` 객체를 관리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.