2012-04-01 103 views
0

所以,我已經做了相當多的谷歌搜尋試圖找出是否有一些最好的智能指針來處理這個問題,但我還沒有能夠解決一個好選擇。哪種類型的指針用於擁有指針的集合

struct Car 
{ 
    int m_doors; 
    int m_headlights; 
    //etc.. 
} 

可以說我有一些班車。我也有一個std::map<int carkey, Car*>這是垃圾場。

汽車*可以通過一些驅動程序添加到垃圾站,驅動程序自己新增了汽車,但司機立即失去了汽車*的所有責任。

我想讓JunkYard負責其所有的汽車,人們可以通過人們訪問垃圾車內的汽車,從汽車中取出廢金屬,或者可以粉碎,但垃圾場永遠摧毀它。

在一天結束時,JunkYard銷燬所有汽車並關閉。

-

A) 如果這是一個多線程的應用程序,其中驅動程序可以訪問汽車並行,而垃圾場可能會破壞汽車,我想,大概一個shared_ptr會是最好的?這是否過度殺傷?其他線程可以訪問汽車,但他們永遠不會長期擁有它,它必須始終屬於JunkYard。

B) 如果這是單線程什麼是最好的選擇 - 假設它仍然是一個地圖< some_smart_car_ptr>。我想讓容器自己刪除汽車。例如,調用map.erase(...)應刪除指針並將其從地圖中刪除。

+0

怎麼樣'map '?如果由於某種原因不起作用,我會建議'map >'。 – Philipp 2012-04-01 21:38:22

+0

感謝您的建議,使用地圖並插入地圖可能會導致重新排序,從而複製和移動汽車的權利?至於unique_ptr,是否可以通過將ref作爲參數傳遞來訪問unique_ptr?我會研究這個 – skimon 2012-04-01 21:50:39

+0

unique_ptr是C++ 11嗎?我無法訪問此信息。 – skimon 2012-04-01 21:57:59

回答

0

智能指針絕對是首選。查看boost :: shared_ptr可以很好地擴展標題的解決方案(並且位於TR1 & C++ 11/C++ 0x)。

boost::unordered_map<int carKey, boost::shared_ptr<Car *> > myCollection; 

然後只要實例化一個新的shared_ptr,只要您引用數據來增加引用計數。只有這樣才能防止過早刪除。確保您鎖定指針採集&集合查找範圍內的互斥鎖。類似的方法:

boost::shared_ptr<Car *> CarManager::get(int carKey) { 
    boost::mutex::scoped_lock lock(mutex); 

    // ... etc ... // 
} 
+0

理解,但我的問題是 - 我可以使用除shared_ptr以外的其他東西嗎?在這種情況下,在JunkYard擁有它的時候,任何東西都不能刪除一輛車,所以我可以使用更基本的東西(無參考計數),但是仍然允許我暫時獲得使用的指針? – skimon 2012-04-02 03:36:31

+0

請參閱:http://www.boost.org/doc/libs/1_49_0/libs/ptr_container/doc/ptr_container.html – pestilence669 2012-06-28 00:00:21