考慮下面的類結構:如何處理指針成員的不同所有權策略?
class Filter
{
virtual void filter() = 0;
virtual ~Filter() { }
};
class FilterChain : public Filter
{
FilterChain(collection<Filter*> filters)
{
// copies "filters" to some internal list
// (the pointers are copied, not the filters themselves)
}
~FilterChain()
{
// What do I do here?
}
void filter()
{
// execute filters in sequence
}
};
我露出類圖書館,所以我沒有在它如何被使用的控制。
我目前有關於Filter
對象的所有權的一些設計問題FilterChain
是持有指針。更具體地講,這裏有兩種可能的使用情景FilterChain
:
- 場景A:一些在我的庫中的函數構造(儘可能複雜)的過濾鏈,內存需要分配,並返回一個新分配
FilterChain
目的。例如,其中一個函數從文件構造一個過濾器鏈,該文件可以描述任意複雜的過濾器(包括過濾器鏈的過濾器鏈等)。一旦工作完成,函數的用戶負責對象的銷燬。 - 情景B:用戶可以訪問一堆
Filter
對象,並且希望以特定的方式將它們結合到過濾器鏈中。用戶構建自己使用的對象,然後在完成對象時銷燬它們。當引用它們的FilterChain
被銷燬時,Filter
對象一定不會被銷燬被銷燬。
現在,來管理FilterChain
對象所有權的兩種最簡單的方法是:
FilterChain
擁有Filter
對象。這意味着FilterChain
引用的對象在FilterChain
的析構函數中被銷燬。這與場景B不兼容。FilterChain
確實不是自己的Filter
對象。這意味着FilterChain
的析構函數什麼都不做。現在情景A存在問題,因爲用戶必須知道涉及的所有對象的內部結構,以便全部銷燬它們而不會丟失所有對象,因爲父親FilterChain
本身不會執行它。這只是不好的設計,並要求內存泄漏。
因此,我需要更復雜的東西。我的第一個猜測是設計一個帶有可設置布爾標誌的智能指針,指示智能指針是否擁有該對象。然後,而不是採取指向Filter
對象的指針的集合,FilterChain
將採取指向Filter
對象的智能指針的集合。當調用FilterChain
的析構函數時,會破壞智能指針。當且僅當指示所有權的布爾標誌被設置時,智能指針本身的析構函數纔會銷燬指向的對象(一個Filter
對象)。
我感覺這個問題在C++中很常見,但是我的網頁搜索流行的解決方案或者聰明的設計模式並不是很成功。實際上,auto_ptr
在這裏並沒有真正的幫助,shared_ptr
似乎矯枉過正。那麼,我的解決方案是不是一個好主意?
爲什麼共享指針過度殺傷?在即時實施和維護(每個人都確切地知道它們是什麼)方面比自己更加容易。開銷很小。 – Patrick 2010-07-28 19:12:05
基類析構函數必須是虛擬的。 – 2010-07-28 19:14:29
@Patrick:對我來說感覺像是矯枉過正,因爲shared_ptr是一個引用計數器,我只需要一個布爾標誌。 – 2010-07-28 19:30:32