Почему происходит сбой при удалении, хотя функция определена с новым - PullRequest
0 голосов
/ 03 мая 2020

Я делаю модифицированный двусторонний связанный список, но голова и хвост указывают друг на друга. В insertBeforeCurrent и insertAfterCurrent я определил объекты с новыми и поместил их в связанный список. Но когда я go использую delete, программа просто вылетает. Я провел несколько тестов, и insertBeforeCurrent и insertAfterCurrent работают, и я могу через связанный список и распечатать каждый элемент с помощью getPrevious и getNext. Я также напечатал это, используя только insertBeforeCurrent, insertAfterCurrent, и я также смог сделать то же самое со смесью двух. Мне удалось распечатать его с 1,2,3 и 6 элементами в связанном списке. У меня проблема в отладчике, все работает, пока я не нажму на темп удаления; в этот момент он просто скажет. Не удается найти исходный файл по адресу "/build/glibc-t7JzpG/glibc-2.30/signal/../sysdeps/unix/sysv/linux/raise.c" Найдите файл или отредактируйте исходный путь поиска, чтобы включить его местоположение. Я знаю, что вы можете использовать функцию удаления только для удаления данных, созданных динамическим распределением памяти c, но это не так, поскольку каждый элемент связанного списка создается новым.

Таким образом, проблема со сбоем приложения заключается не в 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;
                }

1 Ответ

0 голосов
/ 04 мая 2020

Я знаю, что вы можете использовать только функцию удаления для удаления данных, созданных динамическим распределением памяти c,

Пока все хорошо.

но, похоже, это не так, поскольку каждый элемент связанного списка создается новым.

Это не имеет значения, поскольку temp в CircularDoublyLinkedList::remove() никогда не указывает к элементу связанного списка. Вы присваиваете temp адрес локальной переменной (search_data) и никогда не меняете его. Локальные переменные не создаются new, поэтому (как вы отмечали ранее) вы не можете delete &search_data.

(вы могли заметить это сами, если бы использовали отладчик для пошагового выполнения кода). при попытке удалить первый элемент списка. В вашем текущем коде temp == head никогда не будет истинным, даже если это ветвь для удаления первого элемента. Точно так же temp == tail никогда не будет истинным, а temp != NULL никогда не будет ложным.)

Возможно, ваша функция search(), вероятно, должна возвращать указатель на узел в списке, а не возвращать узел, после чего вам больше не понадобится (плохо названная) temp переменная.

...