具有引用计数的共享智能指针实现
Shared Smart Pointer Implementation with Reference Counting
在研究引用计数智能指针的一些实现时,我发现了这种类型的实现。
template<typename Type>
class SmartRefCountPointer{
Type* obj;
size_t* count; // <<--- Why pointer/ why is count on heap
}
你能解释一下为什么这个计数器被移到堆上而不是堆上吗?如果你能提供任何失败的案例,我将不胜感激。
计数器必须与指向同一对象的SmartRefCountPointer
的其他实例共享。
引用计数指针的全部意义在于,有一个地方可以跟踪有多少引用。因此,这个位置必须是一个全局变量,或者是堆上的一个位置。您所显示的实现已为以后的选择。
指向同一对象的所有SmartRefCountPointer
也应该更新同一计数器。这就是为什么您不能将计数器保留为智能指针类的成员,并且必须使用指向它的指针(或引用),该指针可以在复制时传递给新的智能指针。它通常由智能指针的第一个实例分配,该实例由对象指针构造(或自身构造),并在引用计数降至零时删除。
这里是我在其中一本书中找到的一个用于引用计数智能指针的实现。
template <typename T> class SmartPointer {
public:
explicit SmartPointer(T* memory);
SmartPointer(const SmartPointer& other);
SmartPointer& operator =(const SmartPointer& other);
~SmartPointer();
T& operator * () const;
T* operator -> () const;
private:
struct Intermediary {
T* resource;
size_t refCount;
};
Intermediary* data;
};
您可以看到Intermediary
是在堆上分配的,而不是在堆栈上。原因如下-
假设您有两个智能指针指向同一个共享资源。如果其中一个智能指针超出了作用域,而在堆栈上定义了类型为Intermediary
的data
,则data
将被清除,因此另一个智能指示器将不再知道引用计数或资源。为了使data
对象即使在其中一个智能指针超出范围后仍然存在,您必须在堆上分配它。这样,即使共享资源的智能指针之一超出范围,data
也会保留。
当引用计数与托管资源本身一起变为0时,Data
将被清除。
引用计数指针的规则为:
- 当你复制它时,引用计数会上升
- 删除它时,引用计数会下降
- 如果您将其分配给另一个(operator=),则将引用计数减少到您持有的引用计数,并获取您现在分配给的引用计数的计数器,然后将其增加
- 如果将其重置为指向一个新对象,则需要一个新的计数器
- 如果在任何时候减少引用计数,它就会降到0,则需要删除基础对象
现在让我们看看它是如何进行复制和赋值的:这个引用计数指针有很多副本,每个副本都有相同的计数器,具有相同的值。因此,"对象"不仅通过有许多指向它的指针来共享,而且它的计数器也是如此。因此,它也是一个指针。
在您的示例中,当我执行++(*count)时,指针本身没有变化,但它所指向的值增加了1,不仅在这个shared_ptr中,而且在指向同一对象的所有其他指针中。
我上面的第三条和第四条规则(可能需要指向不同的计数器)也说明了为什么它不能作为参考。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 1d 智能指针不适用于语法 (*)++
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 优先顺序:智能指针和类析构函数
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 智能指针作为无序映射键,并通过引用进行比较
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 将清除共享智能指针上的呼叫重置
- 有共享引用计数智能指针这样的东西吗
- 智能指针,当c++ 11不支持时,它不会转移所有权,也不会被共享
- 如何使用pthreads以智能的方式向线程共享变量
- C++中具有共享对象验证的智能指针
- 智能指针——通过模板传递派生类的共享指针到基类
- 具有引用计数的共享智能指针实现