删除对象时双重释放或损坏(另一个...)

时间:2012-01-11 17:56:46

标签: c++ free glibc

下面的代码将元素移动到数组的顶部

for ( i = j; i > 0; i-- ) {
  myBlk *tmp = blks[i];
  blks[i] = blks[i-1];
  blks[i-1] = tmp;
  delete tmp;
}

当执行到达delete tmp时,我得到:

*** glibc detected *** double free or corruption (out): 0x00007fffd556ad10 ***

如果我删除该声明,则没有问题。但我不想让记忆泄漏......

4 个答案:

答案 0 :(得分:2)

tmp只是指向数组的现有元素。您尚未通过tmp分配new。因此无需删除tmp。我假设原始数组元素已在其他地方分配和释放。

答案 1 :(得分:1)

宣传评论以回答。

您似乎将内存分配与指针副本混淆。在循环中,您没有进行任何内存分配。你只是复制一个指针 - 它不会分配内存。

所以你应该摆脱delete

for ( i = j; i > 0; i-- ) {
  myBlk *tmp = blks[i];
  blks[i] = blks[i-1];
  blks[i-1] = tmp;
}

delete仅在存在内存分配时调用 - 您没有内存分配。 (至少没有在循环内部)

答案 2 :(得分:0)

这段代码非常非常奇怪。

我的猜测(基于你的评论“指针是在循环中创建的,在循环结束时,我删除它。”)我怀疑delete是多余的。

当您致电delete tmp时,这会释放blks[i-1],因为tmpblks[i-1]都指向同一个内存。如果您希望在循环结束时blks继续包含有效指针,那么delete肯定是多余的。

答案 3 :(得分:0)

您每次都要删除相同的元素吗?

将删除的元素移动到i-1然后递减i。