指针被释放,但valgrind说它不是

时间:2012-09-14 15:19:01

标签: c memory malloc valgrind loss

我释放了一个我做的指针,但是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)

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

看起来你想要走节点列表,随时释放各种链接。似乎listNode结构包含两个成员,条目具有指向节点信息的指针,然后指向列表中的下一个节点。最后你有listNode本身也需要被释放。

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

listNode *nodeCur, *nodeNext ;

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

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