雖然其他答案是正確的,但它們可能不會立即顯示它們如何應用。我們擁有的是這樣的:
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
,操縱引用計數也不是問題(並且不需要const_cast
或mutable
)。
我應該補充一點,實際上,您可能會將代碼結構與此不同 - 特別是,您通常會將更多(所有?)代碼操作引用計數到shared_ptr_internal (或任何你決定稱之爲)本身,而不是與父母shared_ptr
類中的那些人混淆。
您通常還會支持weak_ptr
s。爲此,對於指向同一個shared_ptr_internal
對象的weak_ptr
s的數量,您有第二個引用計數。你破壞了最終的指針對象物體時shared_ptr
引用計數爲0,但只破壞shared_ptr_internal
對象當兩個shared_ptr
和weak_ptr
引用計數變爲0