c++ - 为什么两个程序中的一个会导致 "*** glibc detected *** double free or corruption"错误而另一个不会?

标签 c++ memory

根据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/

相关文章:

c++ - 使用 UDP 的电子邮件客户端/服务器

c++ - 空包时可变参数模板类特化

c - 为什么内存不分配?

memory - MIPS 说明 : sw

c++ - 为什么 type_traits 是类而不是函数

c++ - error C2678 : binary '<' : no operator found which takes a left-hand operand. ..(或者没有可接受的转换)

c++ - 创建插件界面

c++ - vector <X*> vec 与 vector <X>* vec

memory - 试图了解 ARM 二进制镜像中的加载内存地址 (LMA) 和二进制文件偏移量

c - 加载自定义图像格式 C/C++ 二进制