enable_shared_from_this 机制

本文详细介绍了C++中的enable_shared_from_this模板类,包括它的概念、解决的shared_ptr问题、实现机制,以及在多线程环境中的应用案例,强调了正确使用enable_shared_from_this以避免对象重复析构的问题。
摘要由CSDN通过智能技术生成

目录

一、概念

二、shared_ptr的问题

1.shared_ptr实现原理

调用构造函数方式

调用拷贝构造函数

 三、enable_shared_from_this实现机制

四.案例说明

五、总结


一、概念

enable_shared_from_this是一个模板类,定义于#include<memory>中,其原型为:template< class T > class enable_shared_from_this;

        std::enable_shared_from_this 能让一个对象(使用std::shared_ptr<A> pool_obj管理对象obj)安全地生成其他额外的 std::shared_ptr 实例(obj1, obj2, ... ) ,它们与 pool_ojb 共享对象 obj 的所有权。
       若一个类 T 继承 std::enable_shared_from_this<T> ,则会为该类 T 提供成员函数: shared_from_this 。 当 T 类型对象 t 被一个为名为 pt 的 std::shared_ptr<T> 类对象管理时,调用 T::shared_from_this 成员函数,将会返回一个新的 std::shared_ptr<T> 对象,它与 pt 共享 t 的所有权。

二、shared_ptr的问题

1.shared_ptr实现原理

shared_ptr 从 _Ptr_base 继承了 element_type 和 _Ref_count_base 类型的两个成员变量。

template<class _Ty>class _Ptr_base
{ 
    private: 
        element_type * _Ptr
        {
            ptr
        }; // 指向资源的指针 
        _Ref_count_base * _Rep
        {
            ptr
        }; // 指向资源引用计数的指针
};

_Ref_count_base 中定义了原子类型的变量 _Uses 和 _Weaks,它们分别记录资源的引用个数和资源观察者的个数。

class __declspec(novtable) _Ref_count_base
{ 
    private:
         _Atomic_counter_t _Uses;//记录资源引用个数 
         _Atomic_counter_t _Weaks;//记录观察者个数
}

当要使用 shared_ptr 管理同一资源,调用 shared_ptr 的构造函数和拷贝构造函数是不一样的,它们虽然使得不同 shared_ptr 指向同一资源,但管理引用计数资源的方式却不一样。

调用构造函数方式

无法通过原指针增加共享指针的统一引用计数(两个非共享的shared_ptr指向同一个对象࿰

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值