C++ C++;程序在函数之间挂起?

C++ C++;程序在函数之间挂起?,c++,function,C++,Function,我有一个很长的程序,基本上管理一个哈希表;添加、删除等。不过,我的程序中遇到了一个非常奇怪的错误 基本上,我有一个delete函数,它对一个值进行散列,检查一个链表,该链表存储在一个由散列值给定的数组中,用于相应的对象,如果找到,则删除它并退出该函数。基本上是这样的: template<typename T> void HashTable<T>::remove(T* t){ LinkedList<T> list= data[(hash(t))];

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

基本上,我有一个delete函数,它对一个值进行散列,检查一个链表,该链表存储在一个由散列值给定的数组中,用于相应的对象,如果找到,则删除它并退出该函数。基本上是这样的:

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
}
模板
void哈希表::删除(T*T){
LinkedList=数据[(哈希(t))];
Node*prev=NULL;
节点*cur=list.head;
bool running=cur!=NULL;
(跑步时){
T key=cur->getKey();
if(t==键){
如果(prev==NULL){
cur=cur->getNext();
运行=错误;
}否则{
prev->setNext(cur->getNext());
在这一行中不能

LinkedList<T> list= data[(hash(t))]
LinkedList=data[(散列(t))]
您正在创建从数据中获取的LinkedList的副本。我打赌您不是要创建副本,而是要使用引用。此外,我猜它使用的是默认的副本构造函数,而不是您故意创建的副本构造函数。然后,当调用该LinkedList副本的析构函数时,它正在删除堆仍由原始LinkedList保留的条目,导致堆损坏并最终挂起。

在此行中

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

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

请尝试使用
cerr
替换。如果仍然存在问题,请检查
LinkedList
析构函数中可能存在的错误。在调试器下运行它并单击“暂停”按钮。您将看到它挂起的原因。似乎存在链接的意外副本edList实例。如果将remove()中的第一行更改为LinkedList&list=data[…],它会消失吗?@BenjaminKovach:Define breaking。如果您遵守了关于
LinkedList
的操作,您可能不会发现这个特殊问题。但是,您会遇到不同的错误(remove而不是removing)。改为尝试
cerr
。如果仍然存在问题,请检查
LinkedList
析构函数中可能存在的错误。在调试器下运行它并单击“暂停”按钮。您将看到它被挂起的原因。似乎存在LinkedList实例的无意副本。如果将remove()中的第一行更改为LinkedList&list=data[…]是否会消失?@BenjaminKovach:Define breaking。如果您遵守了关于
LinkedList
,您可能不会注意到这个特殊问题。但是,您会遇到不同的错误(删除而不是删除)。如果是这样的话,OP可以将其更改为引用:这绝对是个问题。我将其更改为指向列表的指针,程序现在正在运行。奇怪的问题--感谢您的帮助!如果是这样的话,OP可以将其更改为引用:这绝对是个问题。我将其更改为指向列表和程序正在运行。奇怪的问题--感谢您的帮助!