> 백엔드 개발 > C++ > 다형성 클래스에서 가상 소멸자 없이 'shared_ptr'이 올바르게 작동할 수 있나요?

다형성 클래스에서 가상 소멸자 없이 'shared_ptr'이 올바르게 작동할 수 있나요?

Susan Sarandon
풀어 주다: 2024-12-08 13:50:10
원래의
725명이 탐색했습니다.

Can `shared_ptr` Function Correctly Without Virtual Destructors in Polymorphic Classes?

가상 소멸자 없이 shared_ptr 구현

토론에서 우리는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿