2010-10-25 58 views
2

我的基類需要公開一個方法,該方法對於某些派生類將返回一個指向動態分配數組的智能指針,並且對於其他派生類將返回靜態分配的指針/引用一。C++智能指針指向靜態和動態分配的資源

例如:

class Base 
{ 
    public: 
    virtual ??? foo()=0; 
} 

class A : public Base 
{ 
    private: 
    float arr[10]; 
    public: 
    ??? foo(){ return ???arr; } 
} 

class B : public Base 
{ 
    public: 
    ??? foo(){ 
     allocate array; 
     return ???array; 
    } 
} 

的動態分配的陣列類方法中創建和我寧願使用std::unique_ptr。但是我應該如何處理類A中的靜態分配數組?

我應該創建從std::unique_ptr派生的自己的類,它可以知道指針分配並且不會試圖銷燬靜態分配的指針,或者可能已經存在這樣的指針?

+3

該代碼中沒有任何靜態分配的數組。這可能是一個問題......無論如何,如果你有這樣一個數組,那麼'boost :: shared_ptr' w /自定義刪除將是一個選項。但是,它有一些開銷。如果開銷不可接受,那麼可以基於'boost :: intrusive_ptr'創建自己的腳本,該腳本不具有該開銷問題(動態分配)。 – 2010-10-25 12:10:28

+0

從內存開始,std :: shared_ptr提供了一個構造函數,它可以「擁有」一個對象,但實際上指向另一個對象,就是爲了這個目的。我實際上無法在MSDN上找到任何這方面的證據,而且我也不能編寫任何使用此方法的代碼。 – Puppy 2010-10-25 12:24:04

回答

5

您可以爲Boost smart pointers提供自定義刪除程序。這也可以是一個沒有任何作用的空函數。對於返回動態分配數組的類,可以使用標準的shared_array,對於返回指向靜態分配數組的指針的類,可以返回帶空定製刪除程序的shared_array

請注意,您的問題在這裏更深。返回一個由調用者擁有的指針將不同於返回該對象擁有的指針。你可能想考慮不要在相同的功能中混合這兩個。