在Scott Meyer的书中提到,使用共享指针引起的部分开销是他们需要虚拟函数来正确地破坏尖头对象。我的问题是为什么?这不应该是具有虚拟析构函数的那个尖头对象的类的责任吗?
答案 0 :(得分:1)
这不应该是该指向对象的类具有虚拟析构函数的可能性吗?
这是设计共享指针的一种可能方法,但std::shared_ptr
允许您执行以下操作,即使Base
没有虚拟析构函数:
std::shared_ptr<Base> p { new Derived{} };
它通过在构造std::shared_ptr
时捕获参数的正确删除器来实现,然后在引用计数达到零时调用,而不是仅使用delete
(当然,您可以通过自己使用自定义删除器)。这通常称为类型擦除,这种技术通常使用虚函数调用来实现。