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
阅读全文
0 0
- 171118
- 171118 逆向-再探QQ防撤回
- 【1701H1】【穆晨】【171118】连续第三十九天总结
- SpringMVC用户登录和拦截器简单应用增删改查
- 百练+最近邻点对+递归分治法的运用+计算在左右两边的点距离部分最精彩
- 【poj3279】Fliptile(反转)
- maven assembly报错找不到配置描述
- 内存泄漏
- 171118
- Magento中Mage::helper函数
- MySQL多表查询
- 使用Intellij创建Struts2项目
- Java接口
- 百练+最长上升子序列+DP
- 新手安装ubuntu16.04LTS
- jquery实现获取指定name或ID的多个选中checkbox
- Android:这是一篇 清晰 & 易懂的Rxjava 入门教程