std::deque 使用迭代器擦除元素时内存损坏
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){...}
我的代码偶尔会因为以下原因崩溃
//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){...}