토론에서 우리는 shared_ptr 구현을 위해 다형성 클래스에 가상 소멸자를 요구할 필요성에 대해 의문을 제기했습니다. 제시된 주장에서는 이러한 요구 사항 없이도 shared_ptr이 올바르게 작동할 수 있다고 주장했습니다.
이 주장의 유효성을 확인하기 위해 shared_ptr 구현을 더 자세히 살펴보겠습니다.
유형 삭제 및 템플릿 생성자
shared_ptr은 삭제 유형을 활용하여 동일한 메모리 블록 내에 삭제자를 저장합니다. 참조 카운터. 이 삭제자의 유형은 shared_ptr 유형의 일부가 아닙니다. 템플릿 기반 생성자를 사용하면 shared_ptr은 관리되는 특정 클래스에 따라 다양한 삭제자 유형을 수용할 수 있습니다.
이를 처리하기 위해 다음 생성자를 정의할 수 있습니다.
template<class T> class shared_ptr { public: ... template<class Y> explicit shared_ptr(Y* p); ... };
이 생성자를 다음과 함께 사용할 경우 Base 및 Derived 클래스를 사용하면 적절한 삭제자를 만들고 저장할 수 있습니다. 이 삭제자는 참조 카운터가 0으로 떨어지면 호출되어 적절한 개체 삭제를 보장합니다.
C 11 표준 요구 사항
C 11 표준은 명시적으로 이 동작을 요구합니다. 템플릿 생성자:
"효과: 포인터를 소유하는 shared_ptr 객체를 생성합니다. p."
이는 shared_ptr이 전달된 포인터의 소유권을 가정하고 파기에 책임이 있음을 확인합니다.
소멸자 기능
소멸자 동작은 다음과 같습니다. 다음과 같이 정의됩니다:
"효과: 이것이 객체를 소유한 경우 p와 삭제자 d, d(p)가 호출됩니다. 그렇지 않은 경우 이것이 포인터 p를 소유하고 삭제 p가 호출됩니다."
이는 shared_ptr이 포인터를 직접 관리하는 경우(즉, 명시적인 삭제자가 없는 경우) 기본 소멸자 삭제를 사용하여 object.
결론
이러한 지침에 따르면 다형성 클래스에 가상 소멸자를 요구하지 않고도 shared_ptr을 구현할 수 있다는 것이 분명합니다. 유형 삭제 및 템플릿 생성자와 같은 앞서 언급한 기술을 사용하면 shared_ptr이 다형성을 지원하지 않는 객체를 포함하여 모든 유형의 객체를 효과적으로 관리할 수 있습니다.
위 내용은 다형성 클래스에서 가상 소멸자 없이 'shared_ptr'이 올바르게 작동할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!