具有引用计数的共享智能指针实现

时间:2015-06-24 15:16:53

标签: c++ smart-pointers

在完成引用计数智能指针的一些实现时,我发现了这种类型的实现。

template<typename Type> 
class SmartRefCountPointer{
    Type* obj;
    size_t* count;  // <<--- Why pointer/ why is count on heap
}

你能解释为什么这个计数器被移动到堆而不是堆栈上吗?如果你能提出任何失败案例,我将非常感激。

4 个答案:

答案 0 :(得分:2)

计数器必须与指向同一对象的SmartRefCountPointer的其他实例共享。

重新计数指针的重点在于,有一个地方可以跟踪有多少引用。因此,这个单独的位置必须是全局变量或堆上的位置。您显示的实现已选择用于后者。

答案 1 :(得分:1)

这是我在其中一本书中找到的用于引用计数智能指针的一种实现。

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是在堆上分配的,而不是堆栈。原因如下 -

想象一下,您有两个指向同一共享资源的智能指针。如果其中一个智能指针超出范围,并且在堆栈上定义data类型为Intermediary,那么data将被清除,因此另一个智能指针将不会再知道引用计数或资源。为了使data对象存在,即使其中一个智能指针超出范围,您也必须在堆上分配它。这样,即使共享资源的智能指针之一超出范围,data仍然存在。

当引用计数与托管资源本身一起变为0时,

Data被清除。

答案 2 :(得分:1)

指向同一对象的所有SmartRefCountPointer也应该更新同一个计数器。这就是为什么你不能将计数器保持为智能指针类的成员并且必须使用它的指针(或引用),它可以传递给副本上的新智能指针。它通常由智能指针的第一个实例分配,该指针由对象指针构成(或自身构造)并在引用计数降至零时删除。

答案 3 :(得分:0)

引用计数指针的规则是:

  • 复制时,引用计数会上升
  • 删除时,引用计数会下降
  • 如果您将其分配给另一个(operator =),则将引用计数减少到您所持有的那个并获取您正在分配的计数器,并增加它。
  • 如果将其重置为指向新对象,则需要一个新计数器。
  • 如果在任何时候减少引用计数,它会下降到0,则需要删除基础对象。

现在让我们看看它如何用于复制和分配:这个引用计数指针有很多副本,每个指针都有相同的值,具有相同的值。因此,不仅是&#34;对象&#34;通过提供许多指针来共享它,但它的计数器也是如此。因此它也是一个指针。

在您的示例中,当我执行++(* count)时,指针本身不变,但它指向的值增加1,不仅在此shared_ptr中,而且所有其他指向同一对象的值。

我上面的第3和第4条规则(它可能需要指向不同的计数器)也说明了为什么它不能作为参考。