C链接列表内存泄漏

时间:2016-02-15 22:55:05

标签: c memory-leaks linked-list

我无法弄清楚为什么我的链表有内存泄漏。

我有一个名为void insertAtFront(Node **head, char *key) { Node *new = malloc(sizeof(Node)); if (!new) fatal("Malloc of new Node failed"); new->word = key; new->next = *head; *head = new; }

的方法
removeAtFront()

然后我有一个释放节点的void removeAtFront(Node **head) { Node *newhead = (*head)->next; free(*head); *head = newhead; } 方法。

var someObject = {

  run: function(str) {
    console.log("running");
    this.methods[str]();
  },

  method1: function() {

    console.log("method 1");
  },

  method2: function() {
    console.log("method 2");
  },


  methods: {

    one: this.method1,    //This == the 'methods' object
    two: this.method2     //I want to refer to the 'someObject' object

  }

};

如果我只添加一个节点然后删除它,则没有泄漏。如果我删除多个节点,valgrind会显示与添加的节点数量成比例的泄漏。我真的无法理解为什么在节点被释放时会发生这种情况。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您的问题似乎是一个生命周期问题。您没有发布调用代码和完整的可验证示例。节点被正确释放,但有些东西没有。是否已分配key参数而未在其他地方释放?

释放节点时,您free成员word。如果key参数是由调用insertAtFront()的函数分配的,则该节点应该是空闲的。如果仅在某些时间分配word字段,则很难确定何时释放它。

一个好的解决方案是insertAtFont()始终复制key字符串,removeAtFront()始终释放word成员:

void insertAtFront(Node **head, const char *key) {
    Node *new =  malloc(sizeof(*new));
    if (!new)  fatal("Malloc of new Node failed");
    new->word = strdup(key);
    if (!new->word)  fatal("Malloc of Node key failed");
    new->next = *head;
    *head = new;
}

void removeAtFront(Node **head) {
    Node *node = *head;
    if (node) { 
        *head = node->next;
        free(node->word);
        free(node);
    }
}

请注意,insertAtFront()可以方便地免费返回指向新插入节点的指针。