为什么 delete temp 会崩溃,即使函数是用 new 定义的
Why is the delete temp crashing even though the function is defined with new
我正在制作一个修改过的双端链表,但是头和尾指向彼此。在 insertBeforeCurrent 和 insertAfterCurrent 中,我用 new 定义了对象并将它们放入链表中。但是当我去使用删除时,程序就崩溃了。我已经做了一些测试,并且 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;
}
I know you can only use the delete function for delete the data created by the new's dynamic memory allocation,
到目前为止一切顺利。
but that doesn't seem to be the case since every element of the Linked List is created by new.
这无关紧要,因为 CircularDoublyLinkedList::remove()
中的 temp
永远不会指向链表的元素。您将局部变量 (search_data
) 的地址分配给 temp
,并且永远不会更改它。局部变量不是由 new
创建的,因此(正如您之前提到的),您不能 delete &search_data
.
(如果您在尝试删除列表的第一个元素时使用调试器单步执行代码,您自己可能已经注意到了这一点。在您当前的代码中,temp == head
永远不会为真,即使那是删除第一个元素的分支。类似地,temp == tail
永远不会为真,而 temp != NULL
永远不会为假。)
据推测,您的 search()
函数可能应该 return 指向列表中节点的指针而不是 returning 节点,此时您将不再需要(命名不当的)temp
变量。
我正在制作一个修改过的双端链表,但是头和尾指向彼此。在 insertBeforeCurrent 和 insertAfterCurrent 中,我用 new 定义了对象并将它们放入链表中。但是当我去使用删除时,程序就崩溃了。我已经做了一些测试,并且 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;
}
I know you can only use the delete function for delete the data created by the new's dynamic memory allocation,
到目前为止一切顺利。
but that doesn't seem to be the case since every element of the Linked List is created by new.
这无关紧要,因为 CircularDoublyLinkedList::remove()
中的 temp
永远不会指向链表的元素。您将局部变量 (search_data
) 的地址分配给 temp
,并且永远不会更改它。局部变量不是由 new
创建的,因此(正如您之前提到的),您不能 delete &search_data
.
(如果您在尝试删除列表的第一个元素时使用调试器单步执行代码,您自己可能已经注意到了这一点。在您当前的代码中,temp == head
永远不会为真,即使那是删除第一个元素的分支。类似地,temp == tail
永远不会为真,而 temp != NULL
永远不会为假。)
据推测,您的 search()
函数可能应该 return 指向列表中节点的指针而不是 returning 节点,此时您将不再需要(命名不当的)temp
变量。