在完成引用计数智能指针的一些实现时,我发现了这种类型的实现。
template<typename Type>
class SmartRefCountPointer{
Type* obj;
size_t* count; // <<--- Why pointer/ why is count on heap
}
你能解释为什么这个计数器被移动到堆而不是堆栈上吗?如果你能提出任何失败案例,我将非常感激。
答案 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
仍然存在。
Data
被清除。
答案 2 :(得分:1)
指向同一对象的所有SmartRefCountPointer
也应该更新同一个计数器。这就是为什么你不能将计数器保持为智能指针类的成员并且必须使用它的指针(或引用),它可以传递给副本上的新智能指针。它通常由智能指针的第一个实例分配,该指针由对象指针构成(或自身构造)并在引用计数降至零时删除。
答案 3 :(得分:0)
引用计数指针的规则是:
现在让我们看看它如何用于复制和分配:这个引用计数指针有很多副本,每个指针都有相同的值,具有相同的值。因此,不仅是&#34;对象&#34;通过提供许多指针来共享它,但它的计数器也是如此。因此它也是一个指针。
在您的示例中,当我执行++(* count)时,指针本身不变,但它指向的值增加1,不仅在此shared_ptr中,而且所有其他指向同一对象的值。
我上面的第3和第4条规则(它可能需要指向不同的计数器)也说明了为什么它不能作为参考。