如何从内存中“删除”此链接列表?

时间:2014-01-31 14:40:45

标签: c++

我已经创建了用于构建链接列表的类。类声明如下:

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);
};

如何确保此链接列表的所有节点都已删除?析构函数负责删除一个节点。我过去常常制作这样的链表,但从未考虑过清理内存。

1 个答案:

答案 0 :(得分:7)

天真的实施

~LinkedList() {delete next;}

将做正确的事 - delete将在下一个元素上调用析构函数,这将删除它后面的元素,依此类推,删除整个列表。

但是,这意味着递归调用析构函数,因此删除很长的列表可能会导致堆栈溢出。迭代可能会更好:

~LinkedList() {
    while (LinkedList * head = next) {
        next = head->next;
        head->next = nullptr;
        delete head;
    }
}

正如评论中所述,拥有单独的ListNode类,List负责内存管理,Node简单聚合可能更合适包含数据和链接。然后析构函数中的错误范围较小,因为它不需要使任何指针无效以防止递归:

struct Node {
    int data;
    Node * next;
};

struct List {
    Node * head;

    ~List() {
        while (Node * victim = head) {
            head = victim->next;
            delete victim;
        }
    }
};