2011-02-03 32 views
0

我坐在這裏,下面的類問題:關於對象的生命週期和回收責任

class TagCompound : public Tag 
{ 
    public: 
     // [...] Constructor and other methods 
     void insert(Tag *t); 
     // [...] more modifying methods 

    protected: 
     std::vector<Tag *> _values; 
}; 

TagCompound::insert(Tag *t) 
{ 
    _values.push_back(t); 
} 

這是所有的樂趣和花花公子,並與衍生的Tag一類的堆棧和堆分配對象的工作。

當然,如果提供給TagCompound::insert()的指針在堆上分配,它必須在外部的某個位置釋放。這意味着每個從vector中刪除某些東西的方法都必須返回已刪除的指針,以便外部可以再次釋放它,如果必須的話。

我不喜歡這樣,如果調用者忘記delete它會很麻煩和容易出錯。

我嘗試了簡單地假定每指針在矢量_values將堆中分配和執行的缺失在每一個某種方式從_values刪除一些功能,並具有delete運行的每個其餘部件在TagCompound::~TagCompound其他的事情。

這當然完全排除堆棧指針造成無效刪除。

我也試過使用std::auto_ptr但很快我發現它不適用於STL容器。可能有些提升,但我不想使用增強(或任何類型的第三方庫)。

我是否已經用這些方法之一的正確方式,或者是否有某種黑魔法運作得更好?

回答

5

(如果你有一個0X編譯或std :: shared_ptr的),您可以使用TR1 :: shared_ptr的與靜態分配的對象(無操作在這種情況下刪除器)的自定義刪除器。

3

一個解決方案是要求動態分配對象,其生命週期由shared_ptr<Tag>管理。

您可以使用Boost庫中的boost::shared_ptr(在即將推出的C++ 0x標準中也有std::shared_ptr)。

然後你有一個向量shared_ptr s,讓這些shared_ptr自動管理生命時間。當最後的shared_ptr引用消失時,Tag對象將自動銷燬。而不是之前。

乾杯&心連心,