171118

来源:互联网 发布:长沙蓝狐网络培训学校 编辑:程序博客网 时间:2024/05/27 16:42

share_ptr 的实现

原理

引用计数。引用数目=0时销毁该对象

引用计数的基类 _Ref_count_base

实现在不同编译器上可能不同(下面代码均在vs2015上查看)
private:        //销毁指针    virtual void _Destroy() _NOEXCEPT = 0;        //销毁本身    virtual void _Delete_this() _NOEXCEPT = 0;private:        //_Atomic_counter_t typedef unsigned long    _Atomic_counter_t _Uses;    _Atomic_counter_t _Weaks;protected:    //一些方法,包括_Uses,_Weaks的+1,-1操作 ,并且当_Uses ==0 时调用_Destroy(),_Weaks == 0 时调用_Delete_this()    //返回 _Uses    long _Use_count() const;     //引用指针是过期    bool _Expire() const;

_Ref_count继承自_Ref_count_base

继承自_Ref_count_base的模板类,成员变量_Ptr指向模板类Ty
public:    _Ref_count(_Ty *_Px)        : _Ref_count_base(), _Ptr(_Px)        {   // construct        }private:    virtual void _Destroy() _NOEXCEPT        {   // destroy managed resource        delete _Ptr;        }    virtual void _Delete_this() _NOEXCEPT        {   // destroy self        delete this;        }

weak_ptr的实现

同share_ptr 继承自_Ptr_base<Ty>只对控制块中的_Weaks操作,为0时只会销毁本身,不干预raw pointer

_Ref_count_obj

继承自_Ref_count_base<Ty>成员变量中包含_Ptr指向对象的内存,主要功能是创建一个raw 对象,构建出引用控制块_Ref_count_base以下是构造函数
//通过placement new,使用成员变量_Storage构造出Ty对象。make_shared()具体实现template<class... _Types>        _Ref_count_obj(_Types&&... _Args)        : _Ref_count_base()        {   // construct from argument list        ::new ((void *)&_Storage) _Ty(_STD forward<_Types>(_Args)...);

share_ptr的基类 _Ptr_base

两个成员变量
private:    //构造指针    _Ty *_Ptr;    //引用控制块    _Ref_count_base *_Rep;

包含一些对引用控制块_Ref_count_base 方法的封装,包括use_count()获得指针的_Uses等

多个_Reset, _Reset_weak 的 重载包括释放现在资源,或并重新指向新的资源

shared_ptr实现

完全继承自_Ptr_base<Ty>的模板类

“`
private:
virtual void _Destroy() _NOEXCEPT
{ // destroy managed resource
_Getptr()->~_Ty();
}

virtual void _Delete_this() _NOEXCEPT    {   // destroy self    delete this;    }//同变量名,指针所指向对象的内存,typename aligned_union<1, _Ty>::type _Storage;};//重要的创建方法//通过其他share_ptr<Ty1>创建调用_Reset(_Ptr_base<Ty1> other);方法_Ptr = other._Ptr;_Ref = other._Ref;//通过weak_ptr<Ty1> wother创建//如果wOther的引用控制块中_uses为0(过期,及真实对象已释放)则会抛出bad_weak_ptr异常//通过make_shared创建通过_Ref_count_obj创建出对象及引用控制块,传给新建shared_ptr//析构,控制_Uses,使得当_Uses为0时销毁真实对象    ~shared_ptr() _NOEXCEPT    {   // release resource    this->_Decref();    }

“`
shared_ptr的创建方式,
通过raw pointer创建,通过raw pointer创建出_Ref_count_base,_Uses,_Weaks初始都为1,调用_ResetP0 使_Weaks +1
通过Shared_ptr的构造创建调用_Ref_count_base 的_Incref 使_Uses +1
通过make_shared创建会构建出_Ref_count_obj对象_Uses _Weaks,都为1,之后调用_ResetP0方法,使_Weaks +1

原创粉丝点击