我无法弄清楚为什么我的链表有内存泄漏。
我有一个名为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会显示与添加的节点数量成比例的泄漏。我真的无法理解为什么在节点被释放时会发生这种情况。有什么想法吗?
答案 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()
可以方便地免费返回指向新插入节点的指针。