在我们的辩论中,我们质疑要求多态类为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中文网其他相关文章!