根据valgrind,此问题是由以下代码引起的。我想删除列表中的元素,该元素包含与ref相同的整数值。

while(itr1!=list1.end())
{
 if(itr1->num==ref)
 {
  list1.erase(itr1);
 }
 else
 {itr1++;}
}

list1是一个STL列表,列表元素的类型是NODE,这是一个结构。 num是NODE中的整数元素之一。 itr1是list1的迭代器。 ref是一个整数值。

但是在我替换下面的代码后,这是正确的
for(;itr1!=list1.end();itr1++)
{
 if(itr1->num==ref)
 {
  list1.erase(itr1);
  itr1--;
 }
}

我真的看不到两个片段之间的区别。

我不知道您是否可以找出代码不完整的问题。如果需要,我可以发布所有程序。谢谢!

最佳答案

erase之后,删除的元素的迭代器无效。第二个代码是由于运气而工作的,尽管这是未定义的行为,并且应将其视为 buggy 。

关于c++ - 为什么两个程序之一会导致 “*** glibc detected *** double free or corruption”错误,而另一个则不会呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17252534/

10-09 02:56