我試圖從鏈表中刪除重複項,並遇到了一個問題,這可能是顯而易見的,直接的,但我沒有在多年使用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
荷蘭國際集團各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
?
二,free
ing的空間工作正常,但顯然不是正確的事情,因爲我沒有malloc
但new
ed!
我在做什麼錯?如何正確殺死刪除的節點?
EDIT1地:它根據回覆我的帖子 更具描述性EDIT2:3種方法規則添加
[可能有用。](http://stackoverflow.com/q/33047452/472647) – CodeMouse92
'〜Node(){delete next;刪除prev; }'會殺死它周圍的節點。例如,您可以從節點X和Z之間刪除節點Y,將X和Z鏈接起來。然後'刪除Y'來獲取它的資源。 Y的析構函數將破壞X和Z.X和Z的析構函數將破壞他們所觸及的所有元素,包括正在被破壞的X和Z.這是我們過去稱爲非常糟糕的場景。如果我是你,我會重新考慮析構邏輯。 – user4581301