我有一个冗长的程序,基本上管理哈希表;添加,删除等等。我在我的程序中遇到了一个非常奇怪的错误。
基本上我有一个哈希值的删除函数,检查存储在由适当对象的哈希值给出的数组中的链表,如果找到,则删除它并退出该函数。看起来基本上是这样的:
template<typename T>
void HashTable<T>::remove(T* t){
LinkedList<T> list= data[(hash(t))];
Node<T>* prev = NULL;
Node<T>* cur = list.head;
bool running = cur != NULL;
while(running){
T key = cur->getKey();
if(t == key){
if(prev == NULL){
cur = cur->getNext();
running = false;
}else{
prev->setNext(cur->getNext());
cout << &key << '\n';
cur = NULL;
running = false;
}
}
prev = cur;
cur = cur->getNext();
}
cout << "Are we getting here?"; //yes
}
我正在以这种方式调用此函数:
Type* b = buildType(); //produces a Type* from CL arguments
hash.remove(b);
cout << "Are we getting to THIS SPOT?"; //no
基本上,上述程序输出“我们来这里吗?”但不是“我们到达这个地方吗?”
我不知道在这种情况下会出现什么问题,我花了很长时间才意识到这里可能存在问题。有谁知道这个问题可能是什么?
答案 0 :(得分:4)
在这一行
LinkedList<T> list= data[(hash(t))]
您正在创建从数据中获取的LinkedList的副本。我打赌你不是要复制,而是指使用参考。此外,我猜它是使用默认的复制构造函数而不是你有意创建的。然后,当调用LinkedList副本的析构函数时,它将删除仍由原始LinkedList持有的堆条目,从而导致堆损坏并最终挂起。