【问题标题】:memory leak in CreateList function (linked list)CreateList 函数中的内存泄漏(链表)
【发布时间】:2016-03-29 19:55:27
【问题描述】:

我尝试使用带有以下选项的 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;
}

【问题讨论】:

  • 你觉得curr-&gt;next = temp; curr = temp;会做什么?
  • 尝试使用curr-&gt;next = temp; curr = curr-&gt;next;我也在我的系统上编译了它,它工作正常。您使用的是哪个操作系统?
  • 您将 temp 设置为 NULL,然后调用 free()。颠倒顺序。就是这样,在循环内部调用 malloc,然后在外部释放,所以......还有其他控制流问题需要解决。
  • 这只是createList函数吧?你也有freelist吗?您是在 main 中调用它吗?
  • 使用调试符号将行号添加到您的 valgrind 输出中。使用gcc -g

标签: c memory-leaks linked-list valgrind


【解决方案1】:

这行导致问题

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

在这里,您将NULL 分配给结构节点指针currtemp,此后它指向的内存将变为垃圾。您首先使用free() 释放内存并将其分配给NULL

用这个替换你上面的代码

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

【讨论】:

  • 非常感谢 :) 但是,我发现错误出现在我编写的 freeList() 函数中。由于 valgrind 将内存泄漏源指示为 createList(),因此我没有费心去仔细检查 freeList()。我修复了它,内存泄漏错误消失了。感谢大家的建议和耐心:)
  • @Tomislav Kostic;@All:我在 freeList() 函数的 while 循环中放置了一个 return 语句,它只释放了列表中的一个节点。我删除了解决问题的返回语句。
  • @UmashankarVarma 但是你没有放freeList()函数的代码,所以很难得到:p
  • 是的,先生,我的错。作为一个新手,我不认为这个错误可能是因为 freeList() 的错误实现。此外,由于这将是我在 StackOverflow 上的第一个问题,我不想通过添加我当时认为是“不必要”的代码来延长它。很高兴我被证明是错的:)
【解决方案2】:

首先你应该知道的是,对于每个内存分配 (malloc()),你都需要释放该内存 (free()),而这正是 valgrind 返回的 answer

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

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

但是函数 createList() 应该创建列表而不是删除它,所以除了心理体操之外,我没有看到创建列表的目的而不是立即删除。我建议您创建新函数 removeList() 以释放您在主函数末尾调用的内存。

【讨论】:

  • 谢谢 Tomislav :) 我有一个 freeList() 函数,它取消分配以前由 malloc 分配的内存。这就是为什么 createList() 中的内存泄漏问题对我来说是个谜。
猜你喜欢
  • 2021-01-03
  • 2017-09-26
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2019-12-18
  • 1970-01-01
相关资源
最近更新 更多