[C++] 类的所有对象实例共享静态类成员变量

问:智能指针可以对指针的引用数量进行计数,一个智能指针释放时,别的智能指针怎么知道的?

同一类的对象共享同一变量最简单的方法是静态变量:

不像普通的变量,静态成员变量是被所有类对象共享的,不同的对象可以访问对方的该静态成员变量,因此静态成员变量和类对象并没有联系。

The static keyword has another meaning when applied to global variables -- it gives them internal linkage (which restricts them from being seen/used outside of the file they are defined in). Because global variables are typically avoided, the static keyword is not often used in this capacity.
Unlike normal member variables, static member variables are shared by all objects of the class.Static members are not associated with class objects

但是智能指针shared_ptr并不是用的静态变量。

模板类__shared_ptr有两个成员变量和一堆的函数:

template<_Lock_policy _Lp>
class __shared_ptr : public __shared_ptr_access<_Tp, _Lp>
{
    // 省略一堆函数和操作符重载
      element_type*	   _M_ptr;         // Contained pointer.
      __shared_count<_Lp>  _M_refcount;    // Reference counter.
};

然后__shared_count是一个模板类,除了一大堆成员函数外有一个类变量:

template <_Lock_policy _Lp>
class __shared_count
{
      // 省略一堆函数
      _Sp_counted_base<_Lp>*  _M_pi;
};

进一步可知:

  template<_Lock_policy _Lp = __default_lock_policy>
    class _Sp_counted_base
    : public _Mutex_base<_Lp>
    {
      // 省略一堆函数
      _Atomic_word  _M_use_count;     // #shared
      _Atomic_word  _M_weak_count;    // #weak + (#shared != 0)
    };

_Atomic_word就是int:

typedef int _Atomic_word;

所以,shared_ptr的引用计数实现机制,简单地说就是:
同一个指针的所有shared_ptr的计数值是共享的,这个计数值包含在一个类里面,该原始指针的所有shared_ptr都引用这个计数的类,当一个智能指针销毁时,就让计数的类去把计数值减1,如果值为0就把原始指针对应的内存释放,同时销毁计数的类。

原文地址:https://www.cnblogs.com/dylanchu/p/11616369.html