CreateList函数(链表)中的内存泄漏

时间:2015-12-23 11:28:36

标签: c memory-leaks linked-list valgrind

我尝试使用valgrind检查内存泄漏,并使用以下选项:

valgrind --leak-check=full -v ./linkedlist2

Valgrind说createList()函数中存在内存泄漏,但我无法找到它的原因。你能不能帮我理解内存泄漏的原因是什么?

相关代码:

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

struct node* createList(int num)
{
    struct node* temp = NULL;
    struct node* head = NULL;
    struct node* curr = NULL;

    int i = 0;
    if(num <= 0)
    {
        printf("Invalid size for createList\n");
        return;
    }

    for(i=0;i<num;i++)
    {
        temp = malloc(sizeof(struct node)); //allocate memory
        temp->data = i+1;
        temp->next = NULL;

        if(i == 0)
        {
            head = temp;
            curr = temp;
        }else   {
            curr->next = temp;
            curr = temp;
        }
    }
    curr = temp = NULL;
    //curr->next = temp->next = NULL;
    free(curr);free(temp);
    return head;
}

enter image description here

2 个答案:

答案 0 :(得分:1)

此行导致问题

curr = temp = NULL;
//curr->next = temp->next = NULL;
free(curr);free(temp);

那么你在这里为结构节点指针NULLcurr分配temp,从而它所指向的内存变成了垃圾。首先使用free()释放内存并将其分配给NULL

将此代码替换为

free(curr);
free(temp);
curr = temp = NULL;

答案 1 :(得分:0)

你应该知道的第一件事是,对于每个内存分配(malloc())你需要释放那个内存(free()),而这正是valgrind返回的回答enter image description here

这行代码可以解决这个问题

while(head!=NULL){
    temp=head;
    head=head->next;
    free(temp);
   }

但是函数createList()应该创建列表而不是删除它,所以除了心理体操我没有看到创建列表的目的而不是立即删除。我建议你创建一个新函数removeList(),释放你在main函数结束时调用的内存。