C++ C++;程序在函数之间挂起?
我有一个很长的程序,基本上管理一个哈希表;添加、删除等。不过,我的程序中遇到了一个非常奇怪的错误 基本上,我有一个delete函数,它对一个值进行散列,检查一个链表,该链表存储在一个由散列值给定的数组中,用于相应的对象,如果找到,则删除它并退出该函数。基本上是这样的:C++ C++;程序在函数之间挂起?,c++,function,C++,Function,我有一个很长的程序,基本上管理一个哈希表;添加、删除等。不过,我的程序中遇到了一个非常奇怪的错误 基本上,我有一个delete函数,它对一个值进行散列,检查一个链表,该链表存储在一个由散列值给定的数组中,用于相应的对象,如果找到,则删除它并退出该函数。基本上是这样的: template<typename T> void HashTable<T>::remove(T* t){ LinkedList<T> list= data[(hash(t))];
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可以将其更改为引用:这绝对是个问题。我将其更改为指向列表和程序正在运行。奇怪的问题--感谢您的帮助!