【问题标题】:pointer is freed but valgrind says it isn't指针被释放但 valgrind 说它不是
【发布时间】:2012-09-07 18:56:29
【问题描述】:

我释放了我创建的指针,但 Valgrind 仍然报告我丢失了字节,所以我不确定如何处理它。

有问题的代码是:

listNode* temp = (listNode*)malloc(sizeof(listNode));
node = list->head;
while (node != NULL)
{
    temp = node->next;
    free(node->entry);
    free(node);
    node = temp;
}
free(temp);

使用 valgrind 输出:

16 bytes in 1 blocks are definitely lost in loss record 13 of 21
==2137==    at 0xB823: malloc (vg_replace_malloc.c:266)
==2137==    by 0x100001B1E: freeList (main.c:110)
==2137==    by 0x100001CB5: main (main.c:157)

【问题讨论】:

    标签: c memory malloc valgrind loss


    【解决方案1】:

    除非node == NULL,否则您不会在给定的代码中free 分配给malloc 的内存。您分配一块内存,将其分配给temp,然后继续循环以重新分配给temp 其他地址,从而丢失您使用malloc 分配的内存。

    看起来您根本不需要malloc:您只是将temp用作临时指针:为什么需要为它分配内存?

    【讨论】:

      【解决方案2】:

      看起来您想要遍历节点列表以释放各种链接。 listNode 结构似乎包含两个成员,entry 具有指向节点信息的指针,next 指向列表中的下一个节点。最后你有 listNode 本身,它也需要被释放。

      假设列表的末尾由 next 表示为 NULL,我将采取的方法如下:

      listNode *nodeCur, *nodeNext ;
      
      nodeCur= list->head;
      while (nodeCur)
      {
          nodeNext = nodeCur->next;
          free(nodeCur->entry);
          free(nodeCur);
          nodeCur = nodeNext;
      }
      

      下一个问题是什么是变量列表。它是否也需要作为列表删除的一部分而被释放?

      【讨论】:

        猜你喜欢
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 2019-03-31
        • 2014-04-24
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多