其他分享
首页 > 其他分享> > 阅读智能指针

阅读智能指针

作者:互联网

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