【发布时间】:2018-01-05 08:11:02
【问题描述】:
我试图实现一个链表来解决算法问题。
它基本上可以工作,但是结果证明我使用了太多内存。
如果有人指出以下析构函数设计的缺陷,我将不胜感激。
template<typename T>
struct Node {
Node(): item(0),next(0) {}
Node(T x): item(x),next(0) {}
T item;
Node* next;
};
template <typename T>
struct List {
List() : head(0),tail(0) {}
Node<T>* head;
Node<T>* tail;
void insert(T x) {
Node<T>* newNode = new Node<T>(x);
if(head == NULL) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = tail->next;
}
}
void clearRecur(Node<T>* h) {
if(h) {
clearRecur(h->next);
delete h;
}
}
void clear() {
if(head) {
clearRecur(head);
}
}
};
【问题讨论】:
-
“太多”是多少?
-
对于初学者来说,这里有悬空参考。您释放
clearRecur中的列表,但永远不要更改tail或h之前的元素(或头部,如果它是第一个)。这同样适用于clear,当你完成时 -head和tail仍然设置,但已经发布。 -
你没有析构函数。你可以制作浅拷贝。
-
@PeterHwang 你可以。但是由于
Node不拥有任何东西的所有权(不是自动分配的),因此使用非默认析构函数并不是什么大问题。 -
只要调用 clear 我就看不到内存泄漏。由于递归清除调用需要分配内存,您可能正在使用内存,这也会将列表中的元素数量限制为最大堆栈深度。您可以尝试用简单的迭代方法替换它,看看是否有帮助。
标签: c++ memory-management data-structures