2011-11-02 64 views
4

當我查看「增強版」智能指針 - 增強功能是添加引用計數時 - 我看到他們使用一些「複雜」技術來進行引用計數,例如一個完全獨立的類或指向一個整數的指針。爲什麼不只是使用一個靜態變量作爲智能指針的參考計數

下面是一個例子:

template<class T> 
class SmartPointer{ 
    T* mp_T; 
    unsigned int * mp_Count; 
    public: 
    ... all the APIs ... 
}; 

我想知道,有什麼益處呢?因爲我們的目標是讓所有的實例共享的價值,爲什麼不乾脆宣佈它作爲一個靜態成員變量:

template<class T> 
class SmartPointer{ 
    T* mp_T; 
    static unsigned int m_Count; 
    public: 
    ... all the APIs ... 
}; 

我必須錯過的東西,但經過一番搜索,我找不到任何答案。請說明一下。

回答

10

靜態數據成員由相同類的所有實例共享。但是兩個不同的智能指針不應該共享相同的引用計數。舉一個例子,

SmartPointer<int> a; 
... 
SmartPointer<int> b; 
SmartPointer<int> c = b; // ref count increased due to copying. 

在你的計劃,am_Count將同時在註釋行增加了,因爲static變量是所有SmartPointer<int>之間共享,雖然此行是無關a

1

在一個典型的用例中,將會有多個對象,其中一個或多個共享指針指向每個對象。

使用static引用計數將不允許有多個對象,因爲只有一個引用計數。

5

這個想法並不是「讓所有的實例共享價值」。是什麼讓你這麼想?

這個想法是讓所有的指針實例指向同一個對象來共享計數器。而指向不同對象的指針實例應該有獨立的非共享計數器。靜態計數器不會實現這個概念。

1

目標不是讓SmartPointer<T>的所有實例共享整個過程的單個值。相反,目標是SmartPointer<T>的多個實例共享一個值。可能有多個智能指針共享一個值的T*的多個實例。例如

SmartPointer<MyType> sp1 = new MyType(); 
SmartPointer<MyType> sp2 = new MyType(); 

這裏有一個靜態計數器會錯誤地扎兩個完全獨立的MyType值的一輩子在一起。

相關問題