ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

阅读智能指针

2022-08-18 11:02:21  阅读:194  来源: 互联网

标签:count Count Incref weak 智能 base 阅读 ptr 指针


shared_ptr

shared_ptr继承自_Ptr_base<_Ty>,是一个引用计数资源管理的类。

_Ptr_base是shared_ptr和weak_ptr的基类。

Ptr_base

image

Ptr_base持有两个数据成员,element_type和_Ref_count_base
对相同模板参数的shared_ptr可以访问,对一系列模板家族的_Ptr_base可以访问,对一系列模板参数的atomic可以访问。

element_type

image
element_type萃取了_Ty的类型,如果_Ty是数组,则萃取出元素的类型。

_Ref_count_base

通用的代码用于引用计数。

_Ref_count_base有两个虚函数,_Destroy和_Delete_this函数,第一个是销毁管理的资源,第二个是销毁自己。

image
还有两个原子类型,一个是_Uses,一个是_Weaks。

    bool _Incref_nz() noexcept { // increment use count if not zero, return true if successful
        auto& _Volatile_uses = reinterpret_cast<volatile long&>(_Uses);
#ifdef _M_CEE_PURE
        long _Count = *_Atomic_address_as<const long>(&_Volatile_uses);
#else
        long _Count = __iso_volatile_load32(reinterpret_cast<volatile int*>(&_Volatile_uses));
#endif
        while (_Count != 0) {
            const long _Old_value = _INTRIN_RELAXED(_InterlockedCompareExchange)(&_Volatile_uses, _Count + 1, _Count);
            if (_Old_value == _Count) {
                return true;
            }

            _Count = _Old_value;
        }

        return false;
    }

看一下_Incref_nz,这个函数叫做Inc(Increment) ref(reference),nz(not zero)。
增加引用计数,如果非零的话。

_InterlockedCompareExchange,会将第一个参数的值和第三个进行比较,如果相等,则用第二个参数与第一个参数交换,并返回旧值。

还有两个函数,_Incref和_Incwref,增加use count和weak reference count,_Incref和_Incref_nz,相比,是不需要考虑非零的。

然后是_Decref和_Decwref,一个是decrement use count,另一个是decrement weak reference count。
image
_Decref的use_count减少为0后,就会销毁资源,然后调用_Decwref,减少weak引用计数,而_Decwref只会减少weak reference count,当为0的时候,就会_Delete_this。

image
这里还有个返回use count,以及返回删除器的函数。

标签:count,Count,Incref,weak,智能,base,阅读,ptr,指针
来源: https://www.cnblogs.com/pixel-Teee/p/16597934.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有