C 链表内存泄漏



我不知道为什么我的链表有内存泄漏。

我有一个名为insertAtFront()的方法

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

如果我只添加一个节点然后删除它,则没有泄漏。如果我删除多个节点,valgrind 会显示与添加多少额外节点成正比的泄漏。我真的不明白为什么在节点被释放时会发生这种情况。有什么想法吗?

您的问题似乎是生命周期问题。 您没有发布调用代码和完整的可验证示例。 节点已正确释放,但有些内容未正确释放。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()可以方便地免费返回指向新插入节点的指针。

相关内容

  • 没有找到相关文章

最新更新