我需要一個集合,其中我可以存儲具有虛擬功能的堆分配對象。我知道約boost::shared_ptr
,std::unique_ptr
(C++ 11)和boost::ptr_(vector|list|map)
,但它們不能解決重複的指針問題。C++指針容器與引用計數
只是爲了說明一個問題 - 我有接受堆上分配的指針,並將其存儲以備將來使用的功能:
void SomeClass::add(T* ptr)
{
_list.push_back(ptr);
}
但是,如果我用同樣的參數調用add
兩次ptr
- _list
將包含兩個指針到相同的對象,並且當_list
被銷燬時,會發生多個相同對象的刪除。
如果_list
將計算他存儲的指針並在刪除時使用它們,則此問題將被解決,並且對象不會被多次刪除。
所以,問題是:
是否有人知道指針的一些庫集合(向量,列表,地圖在本質),支持自動刪除破壞和支持引用計數?
或者我可以使用其他技術解決這個問題?
更新:
我需要支持重複的指針。所以我不能使用std::set
。
由於Kerrek SB和Grizzly提到的 - 這是一個壞主意,一般使用原始指針,並建議使用std::make_shared
並通過new
忘掉實例。但這是客戶端代碼的責任 - 不是我設計的類。即使我改變add
簽名(當然_list
容器),以
void SomeClass::add(std::shared_ptr<T> ptr)
{
_list.push_back(ptr);
}
然後有人(誰不知道std::make_shared
)還可以這樣寫:
SomeClass instance;
T* ptr = new T();
instance.add(ptr);
instance.add(ptr);
因此,這不是一個完整的我等待的解決方案,但如果您單獨編寫代碼,則會很有用。
更新2:
作爲一種替代的解決方案,我發現一個clonning(使用所生成的拷貝構造)。我的意思是,我可以改變我的add
功能是這樣的:
template <typename R>
void SomeClass::add(const R& ref)
{
_list.push_back(new R(ref));
}
這將使虛擬方法(R - 類擴展一些基本的類(接口))呼叫和不允許重複的指針。但是這個解決方案有克隆的開銷。
如何存儲共享指針?如果一個人被摧毀,另一個人仍然有效。只有當兩者都被銷燬(並且其他共享指針不存在於同一個對象中)時,它們指向的對象纔會被銷燬。 – cHao 2012-01-08 01:55:17
將兩個'shared_ptr'刪除到同一個對象只會摧毀一次對象,我沒有看到問題所在。 – 2012-01-08 02:04:11
@BenVoigt:只會工作,如果兩個'shared_ptrs'之一是通過複製其他創造,沒有創造的時候無論從原料三分球,這是增加似乎想做 – Grizzly 2012-01-08 02:11:11