C ++程序挂起BETWEEN函数?

时间:2013-04-24 20:19:57

标签: c++ function

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

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

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

基本上,上述程序输出“我们来这里吗?”但不是“我们到达这个地方吗?”

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

1 个答案:

答案 0 :(得分:4)

在这一行

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

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