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

std::deque memory corruption when using iterator to erase elements

本文关键字:损坏 元素 内存 擦除 迭代器 std      更新时间:2023-10-16

我的代码偶尔会因为以下原因而崩溃

//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 ),否则无法重新获取此指针。

谢谢

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

您关于反向迭代的陈述

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

如果您将在循环体中操纵迭代器,则可能是非法的。取消引用 xxx.end () 可能会导致分段错误。在这种情况下,最好使用反向迭代器:

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