时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行是合法的。 –