【发布时间】:2016-01-11 17:03:13
【问题描述】:
我正在尝试从链接列表中删除重复项,但遇到了一个问题,这可能很明显且很简单,但我已经很多年没有使用过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。很公平,但是当我在main 中构建整个列表时,我是newing 每个Node:
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 一些在其他地方被 newed 的东西?是不是因为newed 超出了当前范围?
其次,freeing 空间工作正常,但显然不是正确的做法,因为我没有 malloc 而是 newed!
我做错了什么?如何正确杀死已删除的节点?
Edit1:根据对我帖子的回复使其更具描述性 Edit2:添加了 3 种方法的规则
【问题讨论】:
-
~Node() { delete next; delete prev; }将杀死它周围的节点。例如,您从节点 X 和 Z 之间删除节点 Y,链接 X 和 Z。然后您delete Y以取回它的资源。然后 Y 的析构函数将销毁 X 和 Z。X 和 Z 的析构函数将销毁它们接触的所有内容,包括正在被销毁的 X 和 Z。这就是我们过去所说的非常糟糕的场景。如果我是你,我会重新考虑析构函数的逻辑。
标签: c++ pointers linked-list segmentation-fault duplicate-removal