我已经创建了用于构建链接列表的类。类声明如下:
class LinkedList
{
private:
int data;
LinkedList *next;
static int count;
public:
LinkedList(void);
~LinkedList(void);
int insert(int arg);
int remove(int arg);
bool find(int arg);
};
如何确保此链接列表的所有节点都已删除?析构函数负责删除一个节点。我过去常常制作这样的链表,但从未考虑过清理内存。
答案 0 :(得分:7)
天真的实施
~LinkedList() {delete next;}
将做正确的事 - delete
将在下一个元素上调用析构函数,这将删除它后面的元素,依此类推,删除整个列表。
但是,这意味着递归调用析构函数,因此删除很长的列表可能会导致堆栈溢出。迭代可能会更好:
~LinkedList() {
while (LinkedList * head = next) {
next = head->next;
head->next = nullptr;
delete head;
}
}
正如评论中所述,拥有单独的List
和Node
类,List
负责内存管理,Node
简单聚合可能更合适包含数据和链接。然后析构函数中的错误范围较小,因为它不需要使任何指针无效以防止递归:
struct Node {
int data;
Node * next;
};
struct List {
Node * head;
~List() {
while (Node * victim = head) {
head = victim->next;
delete victim;
}
}
};