2012-09-13 165 views
0

我創建了一個智能指針類,如:智能指針數組

template <class T> 
class Owner 
{ 
    T* m_p; 
public: 
    Owner(T *p=0) : m_p(p) {} 
    ~Owner() { if (m_p) delete m_p; } 
    T* operator ->() { return m_p; } 
    T& operator *() { return *m_p; } 
    // other members. 
}; 

它運作良好(類似於給auto_ptr升壓庫),但現在我有,我想存儲的動態數組的要求在一個OBJ智能指針,並且它必須支持:

1)插入新的智能指針存入智能指針數組讓陣列調整大小並獲取新obj的所有權,

2)刪除一個智能指針即時和資源獲得fre編輯,

3)當最終化數組時,所有對象都被刪除。

我在想使用std::vector<Owner<T> >,但似乎C++最佳實踐建議不要將智能指針存儲在std容器中,因爲複製/分配行爲,那麼我可以採用其他什麼方法來實現這一點?像下面例子中的OwnerArr:

class Adapter; 

class Computer 
{ 
public: 
     Computer() {} 
     ~Computer() { // adapters get freed automatically here. } 

     void insertAdapter(Adapter* pAdapter) { m_adapters->appendOne(pAdapter); } 
     OwnerArr<Adapter> m_adapters; 
}; 

在此先感謝!

+3

爲什麼不使用已存在的智能指針?見例如['std :: shared_ptr'](http://en.cppreference.com/w/cpp/memory/shared_ptr)和['std :: unique_ptr'](http://en.cppreference.com/w/cpp /存儲器/的unique_ptr)。 –

+1

'auto_ptr'在標準庫中,而不是boost。你需要'shared_ptr'(或'unique_ptr',如果你可以使用C++ 11的話)。 – kennytm

+2

你需要複製運算符和複製賦值運算符([three規則](http://en.wikipedia.org/wiki/Rule_of_three_ (C%2B%2B_programming)))。你必須弄清楚適當的所有權轉讓政策。除了學習,沒有理由重新發明車輪。 –

回答

0

你無法保存您的Owner,或std::auto_ptr(你不應該反正用的,因爲它是不建議使用),在標準的容器,因爲他們是不是真的能夠複製。

在C++ 11中,有std::unique_ptr:一個單一所有權智能指針來代替auto_ptr,它是可移動但不可複製的。只要您不需要執行任何涉及複製的操作,就可以將其移動或放置到任何容器中。如果您需要多個指針來共享同一對象的所有權,則可以使用std::shared_ptr代替。

如果你堅持使用舊的語言版本出於某種原因,然後加速可以給你smart pointers,包括shared_ptr非常相似的標準之一,或pointer containers類似於您OwnerArray

如果您決定推出自己的資源管理課程,請務必記住Rule of Three。你顯示的類有隱式生成的拷貝構造函數和拷貝賦值操作符,它們可能導致兩個指針擁有 - 並嘗試刪除 - 這是非常糟糕的同一個對象。您需要防止複製(通過刪除這些函數,或者(2011年之前的版本)將它們聲明爲不帶實現的私有),或者實現某種安全的複製語義。

+0

非常感謝,我認爲指針容器可能是我的興趣所在。 –