首页 > 解决方案 > 为什么即使函数是用新定义的,删除临时也会崩溃

问题描述

我正在制作一个修改后的双端链接列表,但头部和尾部相互指向。在 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;
                }

标签: c++gdbdelete-operator

解决方案


我知道你只能使用 delete 函数来删除 new 的动态内存分配创建的数据,

到现在为止还挺好。

但情况似乎并非如此,因为链接列表的每个元素都是由 new 创建的。

这无关紧要,因为tempinCircularDoublyLinkedList::remove()从不指向链表的元素。您分配给temp局部变量 ( search_data) 的地址并且永远不会更改它。局部变量不是由 . 创建的new,因此(如前所述),您不能delete &search_data.

(如果您在尝试删除列表的第一个元素时使用调试器单步执行代码,您可能已经注意到这一点。在您当前的代码中,temp == head永远不会是这样,即使这是删除第一个元素的分支。同样,temp == tail永远不会是真的,temp != NULL也永远不会是假的。)

猜测一下,您的search()函数可能应该返回指向列表中某个节点的指针,而不是返回该节点,此时您将不再需要(名称不佳的)temp变量。


推荐阅读