非多态共享指针:揭开秘密
Lidström 先生和 Tsirunyan 先生之间的激烈争论提出了一个基本问题:实现shared_ptr而不需要多态虚拟析构函数是可行的上课吗?
先生。 Lidström 的断言shared_ptr
但是,C 11 标准和 Boost 库表明,这样的实施确实是可能的。这一壮举是通过“类型擦除”的概念来完成的:
template<class T> class shared_ptr { public: ... template<class Y> explicit shared_ptr(Y* p); ... };
在提供的示例中,shared_ptr 当引用计数降至零时,删除器对象将了解调用派生类的结构来处理分配的内存。 C 11 标准在以下要求中明确指定了此行为构造函数: 这可以确保正确调用删除器并安全地释放内存,即使指针从 Derived 转换为 Base。 同样,标准概述了析构函数行为: 通过利用模板化构造函数和类型擦除,shared_ptr 可以避免对 virtual 的需要多态类中的析构函数,为更广泛的场景提供高效的内存管理。Requires: ... The expression delete p shall be well formed, shall have well defined behaviour and shall not throw exceptions.
Effects: Constructs a shared_ptr object that owns the pointer p.
Effects: ... Otherwise, if *this owns a pointer p, and delete p is called.
以上是在多态类中,'shared_ptr”可以在没有虚拟析构函数的情况下工作吗?的详细内容。更多信息请关注PHP中文网其他相关文章!