我不得不构建一个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()
答案 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
会自动跳过删除)