1

作成したポインターを解放しましたが、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)
4

2 に答える 2

5

与えられたコードでfree割り当てられたメモリは、 。メモリのブロックを割り当て、それをに割り当ててから、ループに進んで他のアドレスに再割り当てし、で割り当てたメモリを失います。mallocnode == NULLtemptempmalloc

必要なようには見えません。一時的なポインタとしてmalloc使用tempしているだけです。なぜメモリを割り当てる必要があるのでしょうか。

于 2012-09-14T15:21:41.967 に答える
0

移動しながら、さまざまなリンクを解放するノードのリストをたどりたいようです。listNode構造体には、ノード情報へのポインターを持つエントリと、リスト内の次のノードを指すnextの2つのメンバーが含まれているようです。最後に、listNode自体も解放する必要があります。

リストの最後が次にNULLで示されると仮定すると、私が取るアプローチは次のようになります。

listNode *nodeCur, *nodeNext ;

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

次の質問は、変数リストとは何かです。このリストの削除の一環として、それも解放する必要がありますか?

于 2012-09-14T15:34:14.437 に答える