使用迭代器擦除元素时std :: deque内存损坏

时间:2016-07-07 22:06:52

标签: c++ memory stl iterator deque

由于以下

,我的代码偶尔会崩溃
//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 ),否则无法重新获取此指针。

由于

1 个答案:

答案 0 :(得分:0)

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

关于反向迭代的陈述

for(it=xxx.end();it!=xxx.begin();--it){...}
如果你将在循环体中操作迭代器,

可能是非法的。取消引用xxx.end()可能导致分段错误。 在这种情况下,最好使用反向迭代器:

for(it=xxx.rbegin();it!=xxx.rend();++it){...}