我不知道为什么我的链表有内存泄漏。
我有一个名为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()
可以方便地免费返回指向新插入节点的指针。