为什么删除温度会崩溃,即使该函数是用new定义的

问题描述 投票:-2回答:1

我正在制作一个修改后的双链表,但是头和尾指向彼此。在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;
                }
c++ gdb delete-operator
1个回答
0
投票

我知道您只能使用delete功能删除由新的动态内存分配创建的数据,

到目前为止一切顺利。

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

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

((您可能已经注意到,如果您使用调试器在尝试删除列表的第一个元素时逐步执行代码。在当前代码中,temp == head永远不会为真,即使那是删除第一个元素的分支。类似地,temp == tail永远不会为true,temp != NULL永远不会为false。)

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

© www.soinside.com 2019 - 2024. All rights reserved.