2016-07-07 50 views
0

時deque的內存破壞我的代碼偶爾崩潰是由於以下的std ::使用迭代器刪除元素

//queue is a std::shared_ptr<std::deque<Something> > 
//I can guarantee that queue will never be empty. 
std::deque<Something>::iterator it = queue->end(); 
it--; 
queue->erase(it); 

並不總是,但有時。這種情況大多發生在我向前端添加了某些東西之後,然後嘗試刪除後端。

如果我將其更改爲

queue->pop_back(); 

在租約還沒有看到它崩潰了很長的時間。

但任何人都可以啓發我爲什麼前代碼會崩潰?我想這是與調整大小會使所有迭代器無效的事實有關。但我做的是--而不是++

任何人都可以向我解釋爲什麼?

// -----------------------

//更新

// -------- ---------------

我的理解是it只是一個指針。在獲取it和使用it之間沒有插入。

唯一的操作是it--。但由於it--是一個指針移動。我們總是這樣做

for(it = xxx.begin(); it!=xxx.end(); ++it) 
{ 
    ... 
} 

它工作正常。或者是以下非法?

for(it=xxx.end();it!=xxx.begin();--it){...} 

我不明白的是,爲什麼指針在有效範圍內移動會導致內存損壞。

因爲--,it指向了我想要的確切元素,所以沒有辦法重新獲取此指針,除非我只是使用(xxx.end()-1)來代替。

謝謝

+0

[使用std ::雙端隊列:迭代(在C++ STL),用於搜索和刪除某些元素(的可能的複製http://stackoverflow.com/問題/ 15490219 /使用stddequeiterator-in-c-stl-for-searching-and-deletion-certain-eleme) –

+0

@ChrisMorgan:它似乎不是同樣的問題,除非他也在使用'it'之後'erase'。 –

+0

@MatteoItalia我認爲有更多的代碼重複使用它,因爲只要有關隊列非空的評論是真的,給出的3行是合法的。 –

回答

0

如果你的隊列不是空的 - 你的代碼一切都很好。

您對反向迭代

for(it=xxx.end();it!=xxx.begin();--it){...} 

可能的情況下,非法的,如果你將操縱循環體迭代聲明。解除引用xxx.end()會導致分段錯誤。 在這種情況下,最好使用反向迭代:

for(it=xxx.rbegin();it!=xxx.rend();++it){...} 
相關問題