【问题标题】:std::deque memory corruption when using iterator to erase elements使用迭代器擦除元素时 std::deque 内存损坏
【发布时间】:2016-07-07 22:06:52
【问题描述】:

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

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

谢谢

【问题讨论】:

  • @ChrisMorgan:这似乎不是同一个问题,除非他还在erase 之后使用it
  • @Chris Morgan。我所做的只是删除该项目。没有进一步使用它。并且程序在这里崩溃,而不是在后面的代码中。
  • @zijianz 如果您在代码中强制执行非空不变量(而不仅仅是在注释中)会发生什么。我假设它会抱怨队列实际上是空的。如果它不是空的(由代码强制执行)并且这是单线程的,我无法弄清楚为什么 3 行代码会成为问题。

标签: c++ memory stl iterator deque


【解决方案1】:

如果您的队列不为空 - 您的代码一切正常。

你关于反向迭代的陈述

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2013-04-22
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多