在c ++中释放双指针时出错

时间:2017-07-17 16:05:42

标签: c++ pointers double

我不得不构建一个Cuckoo哈希表。当我释放我的“完整”哈希表以便我可以调整它们并重新调整我的所有值(从一个外部文件的int)时,我得到错误:

org.openqa.selenium.NoAlertPresentException: no alert open

我对双指针并不熟悉,但是代码与它们一起正常工作,直到我尝试解除分配,我按照以下方式执行:

*** glibc detected *** ./a.out: free(): invalid pointer: 0x09c83c7c ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75002)[0x6b1002]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x18)[0x918fa8]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdaPv+0x18)[0x919008]
./a.out[0x8049678]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x655533]
./a.out[0x8048b11]

我在代码中有一行(for(int j = 0; j < currentSize; j++) { if(HT1[j] != NULL) { delete [] HT1[j]; } if(HT2[j] != NULL) { delete [] HT2[j]; } } delete [] HT1; delete [] HT2; ),每次程序重新执行时都会暂停,所以我每次都能看到它们会发生什么。按Enter键继续代码。

感谢您的帮助!

cout.ignore()

1 个答案:

答案 0 :(得分:1)

我认为其中一个问题可能出在这一部分:

delete [] HT1;
delete [] HT2;

currentSize = rehashSize;

Value **HT1 = new Value* [currentSize];
Value **HT2 = new Value* [currentSize];

您(总是)删除在main开头分配的HT1和HT2,但new然后分配给新创建的局部变量(但是在下一次迭代中,原始数组会再次被删除,不是新的)。

尝试在执行new时删除Value **(分配给现有变量):

delete [] HT1;
delete [] HT2;

currentSize = rehashSize;

HT1 = new Value* [currentSize];
HT2 = new Value* [currentSize];

可以多次修复同一指针的删除。 (同样也适用于for循环,在下一次迭代中你再次多次删除项目)

此外,如果您正在进行重新散列,通常您会在删除旧表之前分配新表,并先将旧项放入新表中。

修改

如果仔细查看for循环,则delete[]不应删除这些项目,因为它们是通过new分配的,而不是通过new[]分配的,请尝试改为:

for(int j = 0; j < currentSize; j++)
{
    delete HT1[j];
    delete HT2[j];
}

(无需检查NULL,因为调用delete指针的NULL会自动跳过删除)