首页 >后端开发 >C++ >在没有多态类虚拟析构函数的情况下,shared_ptr 可以工作吗?

在没有多态类虚拟析构函数的情况下,shared_ptr 可以工作吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-16 11:45:11131浏览

Can shared_ptr Work Without Polymorphic Class Virtual Destructors?

没有多态类虚拟析构函数的 Shared_Ptr 实现

Armen Tsirunyan 和 Daniel Lidström 关于 share_ptr 实现的虚拟析构函数的必要性的争论中,确实可以设计一个不需要这样的shared_ptr

技术实现

这个实现的关键在于类型擦除。 Shared_ptr 不仅管理引用计数器,还管理存储在同一内存块中的删除器对象。该删除器的类型与shared_ptr的类型不同,允许灵活地管理具有不同动态类型的对象。

引入了模板化构造函数:

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};

当使用a构造shared_ptr时派生类的指针(例如,shared_ptr sp (new Derived)),Y=Derived 的模板化构造函数为调用。此构造函数使用派生类的特定知识创建删除器对象。当引用计数达到零时,即使基类中没有虚拟析构函数,此删除器也用于安全地处置派生实例。

C 11 标准要求

C 11 标准明确定义了此构造函数的要求:

  • 指针 p 必须可转换为T* 和 Y 必须是完整类型。
  • 表达式“delete p”必须格式良好,具有明确定义的行为,并且不会引发异常。

对于析构函数:

  • 如果shared_ptr为空或共享所有权,则没有边
  • 如果shared_ptr拥有一个带有删除器d的对象,则调用d(p)。
  • 否则,如果shared_ptr拥有一个指针p,则调用“delete p”。

因此,shared_ptr 实现利用类型擦除并仔细管理删除器以有效地处置具有不同动态类型的对象,即使不需要多态类中的虚拟析构函数。

以上是在没有多态类虚拟析构函数的情况下,shared_ptr 可以工作吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn