// _MT_INCR 和 _MT_DECR是宏,对应的API函数为InterlockedIncrement/InterlockedDecrement,功能为对变量加一或减一,特点是线程安全,即它们在多线程下能保证执行结果正确。
// CLASS _Ref_count_base 引用计数辅助基类(增加、减少引用计数用上述宏实现,而不是单纯的++,--)
class _Ref_count_base
{ // common code for reference counting 引用计数通用代码
private:
virtual void _Destroy() = 0; // 销毁托管资源(后续派生类的成员指针变量)
virtual void _Delete_this() = 0; // 销毁自身(delete this;)
private:
_Atomic_counter_t _Uses; // 原子计数器(Uses),其实就是uint_32
_Atomic_counter_t _Weaks; // 弱引用计数
protected:
_Ref_count_base()
{ // construct
_Init_atomic_counter(_Uses, 1); // 将_Uses、_Weaks初始化为1,非原子初始化计数器
_Init_atomic_counter(_Weaks, 1);
}
public:
virtual ~_Ref_count_base() _NOEXCEPT
{ // ensure that derived classes can be destroyed properly 确保派生类可以正确销毁
}
// 如果不为零,则增加使用计数_Uses;如果成功,则返回true
bool _Incref_nz()
{ // increment use count if not zero, return true if successful
for (;;)
{ // loop until state is known
#if defined(_M_IX86) || defined(_M_X64) || defined(_M_CEE_PURE)
_Atomic_integral_t _Count =
static_cast<volatile _Atomic_counter_t&>(_Uses);//volatile申明指令不会被优化而省略
if (_Count == 0)
return (false);
//InterlockedCompareExchange是把第1参数 与 第3参数 比较,如果相等,则用 第2参数 与 第1参数 交换;返回子为_Uses的初值
if (static_cast<_Atomic_integral_t>(_InterlockedCompareExchange(
reinterpret_cast<volatile long *>(&_Uses),
_Count + 1, _Count)) == _Count)
return (true);
#else /* defined(_M_IX86) || defined(_M_X64) || defined(_M_CEE_PURE) */
_Atomic_integral_t _Count =
_Load_atomic_counter(_Uses);
if (_Count == 0)
return (false);
if (_Compare_increment_atomic_counter(_Uses, _Count))
return (true);
#endif
}
}
// Get _Uses值
unsigned int _Get_uses() const
{ // return use count
return (_Get_atomic_count(_Uses));
}
// 递增引用计数_Uses
void _Incref()
{ // increment use count
_MT_INCR(_Mtx, _Uses);// 实现数的原子性加
}
// 递增弱引用计数_Weaks
void _Incwref()
{ // increment weak reference count
_MT_INCR(_Mtx, _Weaks);
}
// 减少引用计数_Uses
void _Decref()
{ // decrement use count
if (_MT_DECR(_Mtx, _Uses) == 0)// 实现数的原子性减
{ // destroy managed resource, decrement weak reference count 销毁托管资源,减少弱引用计数
_Destroy();
_Decwref();
}
}
// 减少弱引用计数_Weaks
void _Decwref()
{ // decrement weak reference count
if (_MT_DECR(_Mtx, _Weaks) == 0) // 当弱引用计数为0是,释放对象
_Delete_this();
}
// Get _Uses值
long _Use_count() const
{ // return use count
return (_Get_uses());
}
// 判断引用计数_Uses是否为0
bool _Expired() const
{ // return true if _Uses == 0
return (_Get_uses() == 0);
}
virtual void *_Get_deleter(const _XSTD2 type_info&) const
{ // return address of deleter object 返回删除对象的地址
return (0);
}
};
// 其所有的派生类都会再定义一个同 智能指针基类_Ptr_base中的存储元素数据 一样的成员变量_Ty *_Ptr,共同指向数据单元的内存地址,用于管理内存。当引用计数变为0时释放该内存(调用_Destroy())。