時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)
來代替。
謝謝
[使用std ::雙端隊列:迭代(在C++ STL),用於搜索和刪除某些元素(的可能的複製http://stackoverflow.com/問題/ 15490219 /使用stddequeiterator-in-c-stl-for-searching-and-deletion-certain-eleme) –
@ChrisMorgan:它似乎不是同樣的問題,除非他也在使用'it'之後'erase'。 –
@MatteoItalia我認爲有更多的代碼重複使用它,因爲只要有關隊列非空的評論是真的,給出的3行是合法的。 –