我正在制作一个修改后的双链表,但是头和尾指向彼此。在insertBeforeCurrent和insertAfterCurrent中,我用new定义了对象,并将它们放入链接列表。但是当我使用Delete时,程序崩溃了。我已经进行了一些测试,并且insertBeforeCurrent和insertAfterCurrent可以正常工作,并且我能够通过链接列表并使用getPrevious和getNext打印每个元素。我还仅使用insertBeforeCurrent,insertAfterCurrent进行了打印,并且我也可以对两者的混合进行相同的打印。我能够使用链接列表中的1,2、3和6个元素进行打印。我的问题是调试器,一切正常,直到达到删除温度为止。在这一点上,它只会说。无法在“ /build/glibc-t7JzpG/glibc-2.30/signal/../sysdeps/unix/sysv/linux/raise.c”中找到源文件找到文件或编辑源查找路径以包括其位置。我知道您只能使用delete函数删除由new的动态内存分配创建的数据,但是由于链表的每个元素都是由new创建的,因此情况似乎并非如此。
因此,应用程序崩溃的问题不是Node * x = new Node();
,然后是x = y;
。这些没有显示任何警告,该应用程序正在运行,并且有5或6个人指出了这些警告。谢谢你我的问题特别是delete temp;
,为什么不删除它。我已经将代码留给了某些上下文。
EDIT: I have removed the insertBeforeCurrent and insertAfterCurrent code since it is not needed.
bool CircularDoublyLinkedList::remove(int original_data)
{
Node search_data = search(original_data);
Node* temp = &search_data;
Node* current_next;
Node* current_previous;
if (temp != NULL)
{
if (temp == head)
{
current_previous = temp->getPrevious();
current_next = temp->getNext();
current_previous->setNext(current_next);
current_next->setPrevious(current_previous);
head = current_next;
temp->setNext(NULL);
temp->setPrevious(NULL);
delete temp;
current = current_next;
cout << "Delete successful." << endl;
}
else if (temp == tail)
{
current_previous = temp->getPrevious();
current_next = temp->getNext();
current_next->setPrevious(current_previous);
current_previous->setNext(current_next);
tail = current_next;
temp->setNext(NULL);
temp->setPrevious(NULL);
delete temp;
current = current_next;
cout << "Delete successful." << endl;
}
else
{
current_previous = temp->getPrevious();
current_next = temp->getNext();
current_previous->setNext(current_next);
current_next->setPrevious(current_previous);
temp->setNext(NULL);
temp->setPrevious(NULL);
delete temp;
}
return true;
}
return false;
}
我知道您只能使用delete功能删除由新的动态内存分配创建的数据,
到目前为止一切顺利。
但是事实并非如此,因为链接列表的每个元素都是由new创建的。
这无关紧要,因为temp
中的CircularDoublyLinkedList::remove()
从不指向链接列表的元素。您为temp
分配了局部变量(search_data
)的地址,并且永远不要更改它。局部变量不是由new
创建的,因此(如前所述),您不能delete &search_data
。
((您可能已经注意到,如果您使用调试器在尝试删除列表的第一个元素时逐步执行代码。在当前代码中,temp == head
永远不会为真,即使那是删除第一个元素的分支。类似地,temp == tail
永远不会为true,temp != NULL
永远不会为false。)
猜测,您的search()
函数可能应该返回指向列表中某个节点的指针,而不是返回该节点,此时,您将不再需要(名称不正确的)temp
变量。