为什么不使用静态变量作为智能指针的引用计数呢?
Why not just use a static variable as reference count for smart pointer
当我查看"增强"版本的智能指针时——增强是添加了引用计数——我看到他们使用了一些"复杂"的refcount技术,例如一个完全独立的类或一个指向整数的指针。
下面是一个例子:
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 ...
};
我一定错过了什么,但经过一番寻找,我找不到任何答案。
静态数据成员由同一类的所有实例共享。但是两个不同的智能指针不应该共享相同的引用计数。例如,
SmartPointer<int> a;
...
SmartPointer<int> b;
SmartPointer<int> c = b; // ref count increased due to copying.
在您的方案中,a
的m_Count
也将在注释行中增加,因为static
变量在所有SmartPointer<int>
中共享,尽管这一行与a
无关。
这个想法并不是"让所有实例共享这个值"。你怎么会这么想?
其思想是让所有指向同一对象的指针实例共享计数器。指向不同对象的指针实例应该具有独立的非共享计数器。静态计数器不会实现这个概念。我们的目标不是让一个SmartPointer<T>
的所有实例在整个进程中共享一个值。相反,我们的目标是让多个SmartPointer<T>
实例共享一个值。可能有多个T*
实例,其中多个智能指针共享一个值。例如
SmartPointer<MyType> sp1 = new MyType();
SmartPointer<MyType> sp2 = new MyType();
在这里使用静态计数器会错误地将两个完全独立的MyType
值的生命周期绑定在一起。
在一个典型的用例中,将有多个对象,具有一个或多个指向每个对象的共享指针。
使用static
引用计数将不允许有多个对象,因为只有一个引用计数。
如果在类中定义了静态变量,则意味着该变量在该类的所有对象之间共享,而不管所有对象是否链接。
shared_ptr<int> sp1(new int);
shared_ptr<int> sp2(sp1);
这里,sp1
&sp2
将有一个refCount = 2,因为sp1
和sp2
是链接的。
shared_ptr<int> sp3(new int);
如果refCount是静态的,那么sp3
的refCount应该是3
。sp3
的refCount的期望值是1
,因为sp3
既没有链接到sp1
,也没有链接到sp2
。
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题