2012-01-11 51 views
0

下面的代码移动一个元件到顶端的阵列双重释放或删除对象的腐败(另一个...)

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

为什么要删除任何元素来移动元素? – Mysticial 2012-01-11 17:58:00

+0

我并没有删除所有东西。指针在循环中创建,并在循环结束时删除。 – mahmood 2012-01-11 17:58:59

+1

当存在内存分配时,您只能调用delete(在这种情况下您不具备这一功能)。复制指针不会分配内存。所以只需要删除'delete'。 – Mysticial 2012-01-11 17:59:59

回答

1

推广评论回答。

看来,你正在混淆内存分配与指针副本。在你的循环中,你没有做任何内存分配。你只是在复制一个指针 - 它不分配内存。

所以,你应该摆脱delete的:

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

delete有内存分配仅仅是所谓的 - 你有没有的。 (至少在循环内没有)

+0

但我们可以假设他的数组/向量充满了必须删除的指针。 – CashCow 2012-01-11 18:05:39

+0

@CashCow正确,澄清的答案。 – Mysticial 2012-01-11 18:06:29

0

此代码看起来非常非常奇怪。

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

当您拨打delete tmp时,这释放了blks[i-1],因为tmpblks[i-1]指向相同的内存。如果你期望在循环结尾blks继续包含有效指针,那么delete肯定是多余的。

+0

是的。 Mysticial解释说。 tahnks – mahmood 2012-01-11 18:02:11

2

tmp只是指向数组的现有元素。您尚未通过new分配tmp。所以没有必要删除tmp。我假设原始数组元素在其他地方被分配和释放。

0

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

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

相关问题