2013-03-18 106 views
0

恐怕在這個領域的每個存在的問題/答案似乎是微妙的不同:如何爲shared_ptr的矢量投:: <T>迭代器(上堆)<T>

我有一個shared_ptr<vector<Point>> profile它使用迭代器循環。我想爲了各種目的在循環外部保留一個shared_ptr<Point>,但是我在語法上掙扎。請你指教?

這裏是一個基本的例子:

shared_ptr<Point> peak; 
for (vector<Point>::iterator point=profile->begin(); point!=profile->end(); point++) 
{ 
    ... 
    peak = shared_ptr<Point>(*point); // fails 
    ... 
} 

N.B.我想使用一個簡單的參考/指針Point會很簡單,但我試圖避免這種情況,尤其是涉及堆時。我也意識到,在這種情況下我可以使用索引,但這在容器類之間傳遞的可能性較小。

回答

3

你需要的是shared_ptr<vector<shared_ptr<Point>>>,如果你想安全地繞過shared_ptr<Point>

你的問題是,如果你的shared_ptr<vector<Point>>超出範圍,從vector成員構成任何shared_ptr<Point>將指向無效記憶。

另一方面,如果您新創建的shared_ptr<Point>超出了範圍,那麼您將試圖釋放由vector管理的內存,這不是一件好事!

+0

謝謝。請問shared_ptr 不存在,直到向量本身超出範圍? – mosi 2013-03-18 14:50:28

+0

我不得不查看代碼的其餘部分以查看範圍。 – Nick 2013-03-18 15:56:20

+0

好的,我會保重的。感謝您的建議。 – mosi 2013-03-19 12:03:23

2

*point具有類型Point而不是Point*

但是,即使你把其中的地址(通過&*point)你不能爲它創建一個shared_ptr因爲對象的生命週期具有自動存儲,它不能(也不需要)由shared_ptr進行管理。

只要原始矢量沒有被修改,獲取對象內的對象(或者實際上是一個原始指針)是安全的。然而,修改矢量可能會移動其元素,並且對它們的引用將變爲無效。

最後我想知道爲什麼你的載體被包裹在shared_ptr。這很少有道理。你確定你需要這個嗎?

+0

+1''shared_ptr >' - 剛要查詢這個! – Nick 2013-03-18 14:37:54

+0

是的,你是對的。這是一個矯枉過正的事情,我會刪除它! – mosi 2013-03-18 14:47:59

相關問題