2

我有一个冗长的程序,基本上管理一个哈希表;添加,删除等。不过,我在我的程序中遇到了一个非常奇怪的错误。

基本上我有一个删除函数,它散列一个值,检查存储在一个由适当对象的散列值给出的数组中的链表,如果找到,删除它并退出函数。它看起来基本上是这样的:

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

基本上,上面的程序输出“我们到了吗?” 但不是“我们到达这个地点了吗?”

我不知道在这种情况下可能是什么问题,我花了很长时间才意识到这里可能存在问题。有谁知道问题可能是什么?

4

1 回答 1

4

在这一行

LinkedList<T> list= data[(hash(t))]

您正在创建从数据中获取的 LinkedList 的副本。我敢打赌,您并不是要复制,而是要使用参考。此外,我猜它使用的是默认的复制构造函数,而不是你故意创建的。然后,当调用该 LinkedList 副本的析构函数时,它会删除仍由原始 LinkedList 持有的堆条目,从而导致堆损坏并最终挂起。

于 2013-04-24T20:28:45.943 回答