下面的代码将元素移动到数组的顶部
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 ***
如果我删除该声明,则没有问题。但我不想让记忆泄漏......
答案 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]
,因为tmp
和blks[i-1]
都指向同一个内存。如果您希望在循环结束时blks
继续包含有效指针,那么delete
肯定是多余的。
答案 3 :(得分:0)
您每次都要删除相同的元素吗?
将删除的元素移动到i-1然后递减i。