为什么不使用静态变量作为智能指针的引用计数

时间:2011-11-02 16:36:09

标签: c++ smart-pointers

当我查看“增强版”智能指针时 - 增强是添加引用计数 - 我看到他们使用一些“复杂”技术进行引用计数,例如一个完全独立的类或指向整数的指针。

以下是一个例子:

template<class T>
class SmartPointer{
  T* mp_T;
  unsigned int * mp_Count;
  public:
    ... all the APIs ...
};

我想知道,收益是多少?由于目标是让所有实例共享值,为什么不将它声明为静态成员变量:

template<class T>
class SmartPointer{
  T* mp_T;
  static unsigned int m_Count;
  public:
    ... all the APIs ...
};

我必须错过一些东西,但经过一番搜索后,我找不到任何答案。请详细说明。

5 个答案:

答案 0 :(得分:10)

静态数据成员由同一类的所有实例共享。但是两个不同的智能指针不应该共享相同的引用计数。举个例子,

SmartPointer<int> a;
...
SmartPointer<int> b;
SmartPointer<int> c = b;   // ref count increased due to copying.

在您的方案中,a的{​​{1}}也会在注释行中增加,因为m_Count变量在所有static之间共享,尽管此行与SmartPointer<int>无关。

答案 1 :(得分:5)

这个想法不是“让所有实例共享价值”。是什么让你这么想?

我们的想法是让指向同一个对象的所有指针实例共享计数器。指向不同对象的指针实例应该具有独立的非共享计数器。静态计数器不会实现这个概念。

答案 2 :(得分:1)

在一个典型的用例中,会有多个对象,其中一个或多个共享指针指向每个对象。

使用static引用计数不允许拥有多个对象,因为只有一个引用计数。

答案 3 :(得分:1)

目标不是让SmartPointer<T>的所有实例共享整个过程的单个值。相反,目标是让SmartPointer<T>的多个实例共享一个值。可能有多个T*个实例,其中有几个智能指针共享一个值。例如

SmartPointer<MyType> sp1 = new MyType();
SmartPointer<MyType> sp2 = new MyType();

这里有一个静态计数器会错误地将两个完全独立的MyType值的生命周期联系在一起。

答案 4 :(得分:0)

如果在类中定义了静态变量,则意味着该变量在该类的所有对象之间共享,无论所有对象是否链接。

shared_ptr<int> sp1(new int);
shared_ptr<int> sp2(sp1);

这里,sp1 & sp2 的 refCount = 2,因为 sp1sp2 是链接的。

shared_ptr<int> sp3(new int);

如果 refCount 是静态的,那么 sp3 的 refCount 应该是 3sp3 的 refCount 的预期值为 1,因为 sp3 既未链接到 sp1,也未链接到 sp2