首页 >后端开发 >C++ >多态类中没有虚拟析构函数时,'shared_ptr”能否正常运行?

多态类中没有虚拟析构函数时,'shared_ptr”能否正常运行?

Susan Sarandon
Susan Sarandon原创
2024-12-08 13:50:10718浏览

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 类,可以创建并存储适当的删除器。当引用计数器降至零时,将调用此删除器,以确保正确的对象处置。

C 11 标准要求

C 11 标准明确要求此行为模板化构造函数:

》作用:构造一个拥有该指针的shared_ptr对象p."

这确认了 shared_ptr 承担了传递的指针的所有权并负责其销毁。

析构函数功能

析构函数行为是定义如下:

“效果:如果this拥有一个对象p 和删除器 d,则调用 d(p)。否则,如果 this 拥有指针 p,则调用删除 p。”

这表明如果 shared_ptr 直接管理指针(即,没有显式删除器),默认析构函数删除用于处理

结论

根据这些准则,很明显,shared_ptr 可以在不需要多态类具有虚拟析构函数的情况下实现。上述技术,例如类型擦除和模板化构造函数,使shared_ptr能够有效管理任何类型的对象,包括那些不支持多态性的对象。

以上是多态类中没有虚拟析构函数时,'shared_ptr”能否正常运行?的详细内容。更多信息请关注PHP中文网其他相关文章!

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