Я пытаюсь удалить дубликаты из связанного списка и столкнулся с проблемой, которая, вероятно, очевидна и понятна, но я не использовал C++
за многие годы, и я не мог узнайте, что я делаю неправильно, читая подобные вопросы на SO.Ошибка сегментации (ядро сбрасывается) при удалении указателя
Ниже приведены части моего кода. Я удалил ненужные части (например, конструкторы, другие методы и т. Д.).
template<class T>
class Node {
Node() : data(NULL), next(NULL), prev(NULL) {}
explicit Node(T d) : data(d), next(NULL), prev(NULL) {}
explicit Node(T d, Node<T> *nxt, Node<T> *prv) : data(d), next(nxt), prev(prv) {}
~Node() { delete next; delete prev; }
T data;
Node *next;
Node *prev;
};
template<class T>
class LinkedList {
LinkedList() : head(NULL) {}
explicit LinkedList(Node<T> *head_node) : head(head_node) {}
LinkedList& operator=(const LinkedList ©_list);
~LinkedList(); //didn't implement this but I guess delete head is all?
Node<T>* head;
};
template<class T>
LinkedList<T> RemoveDuplicates(const LinkedList<T> &linked_list) {
//my = overload creates a whole new list with the same data as the original one
LinkedList<T> result = linked_list;
Node<T> *cur = result.head;
Node<T> *prev = NULL;
while (cur) {
if (...) { //duplicate found
Node<T> *temp = cur;
prev->next = cur->next;
cur = cur->next;
cur->prev = prev;
free(temp); //Here is my problem!!!
}
else {
prev = cur;
cur = cur->next;
}
}
return result;
}
Итак, сначала я сделал delete temp
и я получил Segmentation fault
. Тогда я понял, что вы только delete
что вы new
. Справедливо, но я new
ING каждого Node
при создании всего списка в main
:
Node<char> *h = new Node<char>('H'); //I have a constructor to handle this
Node<char> *e = new Node<char>('E');
Node<char> *l1 = new Node<char>('L');
Node<char> *l2 = new Node<char>('L');
Node<char> *o = new Node<char>('O');
h->next = e;
h->prev = NULL;
e->next = l1;
e->prev = h;
//and so on
Так почему я не позволен delete
то, что было new
издания где-то еще? Это потому, что это было new
ed вне текущей области?
Во-вторых, free
Пространство прекрасно работает, но, очевидно, это не так, потому что я не malloc
, но new
ed!
Что я делаю неправильно? Как правильно убить удаленный узел?
Edit1: Сделано это более описательный согласно ответам на мой пост Edit2: Правило 3 методов добавил
[Возможно, полезно.] (Http://stackoverflow.com/q/33047452/472647) – CodeMouse92
'~ Node() {delete next; delete prev; } 'будет убивать узлы вокруг него. Например, вы удаляете узел Y между узлами X и Z, связывая X и Z. Затем вы удаляете Y, чтобы вернуть свои ресурсы. Затем деструктор Y уничтожит X и Z. Деструкторы X и Z уничтожат все, что они касаются, включая X и Z, которые находятся в процессе уничтожения. Это то, что мы называли очень плохой сценой. Если бы я был вами, я бы передумал логику деструктора. – user4581301