2016-07-07 151 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){...} 
相关问题