首页 >后端开发 >C++ >'shared_ptr”可以在'Base”中没有虚拟析构函数的情况下管理'派生”对象吗?

'shared_ptr”可以在'Base”中没有虚拟析构函数的情况下管理'派生”对象吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-09 20:53:10456浏览

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