根据valgrind,这个问题是由下面的代码引起的。我想删除列表中的元素,它包含与ref相同的整数值。
while(itr1!=list1.end())
{
if(itr1->num==ref)
{
list1.erase(itr1);
}
else
{itr1++;}
}
list1是一个STL列表,列表元素的类型是NODE,是一个structure。 num 是 NODE 中的整数元素之一。 itr1 是 list1 的迭代器。 ref 是一个整数值。
但是我用下面的代码替换后,是正确的
for(;itr1!=list1.end();itr1++)
{
if(itr1->num==ref)
{
list1.erase(itr1);
itr1--;
}
}
我真的看不出这两个片段之间的区别。
不知道大家能不能搞清楚代码不完整的问题。如果你需要,我可以发布所有程序。谢谢!
最佳答案
在 erase
之后,删除元素的迭代器将失效。第二个代码的工作是因为运气,尽管这是未定义的行为并且代码应该被认为是错误的。
关于c++ - 为什么两个程序中的一个会导致 "*** glibc detected *** double free or corruption"错误而另一个不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252534/