std:使用迭代器擦除元素时:d内存损坏
std::deque memory corruption when using iterator to erase elements
我的代码偶尔会因为以下原因而崩溃
//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){...}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 为什么会发生堆损坏
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 访问边界外的数组元素会损坏它
- 向量元素数据损坏了Find()操作
- 堆损坏试图将元素添加到现有的 std::vector
- 通过 std::vector.data() 指向 std::vector 元素的指针指向损坏的数据
- 添加元素时,c++ 中的矢量迭代器是否会损坏
- std:使用迭代器擦除元素时:d内存损坏