c++ - 为什么即使函数是用新定义的,删除临时也会崩溃
问题描述
我正在制作一个修改后的双端链接列表,但头部和尾部相互指向。在 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 的动态内存分配创建的数据,但似乎并非如此,因为 Linked List 的每个元素都是由 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 的动态内存分配创建的数据,
到现在为止还挺好。
但情况似乎并非如此,因为链接列表的每个元素都是由 new 创建的。
这无关紧要,因为temp
inCircularDoublyLinkedList::remove()
从不指向链表的元素。您分配给temp
局部变量 ( search_data
) 的地址并且永远不会更改它。局部变量不是由 . 创建的new
,因此(如前所述),您不能delete &search_data
.
(如果您在尝试删除列表的第一个元素时使用调试器单步执行代码,您可能已经注意到这一点。在您当前的代码中,temp == head
永远不会是这样,即使这是删除第一个元素的分支。同样,temp == tail
永远不会是真的,temp != NULL
也永远不会是假的。)
猜测一下,您的search()
函数可能应该返回指向列表中某个节点的指针,而不是返回该节点,此时您将不再需要(名称不佳的)temp
变量。
推荐阅读
- mysql - 一列的MySQL SUM,只取一个相同的字段
- r - 如何在 x 轴上绘制年份,在 y 轴上绘制三个连续变量并重复 32 个因子?
- json - 如何将存储在s3中的地图作为文件读取为spark中的json?
- swift - SwiftUI - “[Color]”类型的值没有“已识别”成员
- linq - 从一个表中求和“金额”并显示在另一个表中
- elasticsearch - Elasticsearch:如何使用 OR 条件查询数组字段?
- r - 从 451 个观测值的数据框中构建时间序列对象,这些观测值不规则地间隔 3 个变量
- php - 如何在 php 中设置连续的 kafka 消费者,而不会出现连接超时
- python - 通过 exec() 使用其他变量名称中的变量
- c++ - 如何使用OpenGL渲染到一个QMainWindow的两个QWidget?