尽管其他答案是正确的,但它们的应用方式可能不会立即显现出来。我们所拥有的是这样的:
template <class T>
struct shared_ptr_internal {
T *data;
size_t refs;
};
template <class T>
class shared_ptr {
shared_ptr_internal<T> *ptr;
public:
shared_ptr(shared_ptr const &p) {
ptr = p->ptr;
++(ptr->refs);
}
// ...
};
这里重要的一点是 shared_ptr 只包含一个指向包含引用计数的结构的指针。事实上,它shared_ptr
本身const
并不影响它指向的对象(我称之为shared_ptr_internal
)。因此,即使/如果shared_ptr
本身是const
,操作引用计数也不是问题(并且不需要 aconst_cast
或mutable
两者之一)。
我可能应该补充一点,实际上,您的代码结构可能与此有所不同——特别是,您通常会将更多(全部?)代码用于操作引用计数到 shared_ptr_internal (或任何您决定调用它)本身,而不是与父shared_ptr
类中的那些混淆。
您通常还会支持weak_ptr
s. 为此,您需要对weak_ptr
指向同一shared_ptr_internal
对象的 s 数量进行第二个引用计数。当shared_ptr
引用计数变为 0 时销毁最终的指针对象,但仅当引用计数和shared_ptr_internal
引用计数都变为 0 时才销毁该对象。shared_ptr
weak_ptr