2016-10-20 2 views
0

Scott Meyer의 저서에서 공유 포인터를 사용하여 발생하는 오버 헤드의 일부는 뾰족한 개체를 올바르게 파괴하는 데 virutal 함수가 필요하다는 것입니다. 내 질문은 왜? 이것은 가상 소멸자를 갖는 지적 객체의 클래스의 책임이 아니라고 생각합니까?공유 포인터에 가상 함수가있는 이유

답변

1

가상 소멸자가있는 해당 지적 객체의 클래스에 대한 책임이 아닌가요?

Base가 가상 소멸자이없는 경우에도, 공유 포인터를 설계하는 하나 개의 가능한 방법이 될 수 있지만, std::shared_ptr 당신이 다음을 수행 할 수 있습니다 것

: 그것은을 캡처하여이 작업을 수행

std::shared_ptr<Base> p { new Derived{} }; 

std::shared_ptr이 생성 될 때 인수에 대한 올바른 deleter를 호출 한 다음 delete을 사용하는 대신 참조 횟수가 0이 될 때 호출합니다 (물론 사용자 정의 deleter를 전달하여 대신 사용할 수 있음). 일반적으로 삭제 유형이라고하며이 기술은 일반적으로 가상 함수 호출을 사용하여 구현됩니다.

+0

그래서 어떤 종류의 유연성이 있습니다. 하나의 후속 질문. 여기 http://stackoverflow.com/questions/3899790/shared-ptr-magic 템플릿 생성자를 사용하고 생성시 템플릿 유형 공제를 사용하여 유형을 추론 할 수 있다고 솔루션에서 언급되었습니다. 이 솔루션이 가상 기능의 오버 헤드를 제거하지 않을까요? – mkmostafa

+0

@mkmostafa 그래도 어떻게 든 저장하고 호출해야합니다. – TartanLlama

+0

하지만 추론 된 형식의 소멸자에 대한 포인터를 저장하여 직접 호출 할 수 있습니다. 이 경우 포인터를 저장할 때 ~ 공유 포인터가 생성 될 때 파생되지 않음을 의미합니까? – mkmostafa

관련 문제