0

私はCでリンクリストの実装を行っています。プログラムはファイルからファイルからデータを読み取り、それをリンクリストに入れ、いくつかのものを出力してから、リンクリストを削除してメモリを解放します。次に valgrind を実行すると、ファイルにメモリ リークがあることがわかります。ファイルを処理するための私のコードは次のとおりです。

while(fgets(line, sizeof line, file) != NULL){
            theData = (ElementStructs*) malloc(sizeof(ElementStructs));
            token = strtok(line, " \t\n");
            strcpy((theData->word), token);

            AddToBackOfLinkedList(theList, theData);
}

/* Do some printing here */

fclose(file);

DestroyLinkedList(theList);

もちろん、私が目にする問題は、データ トークンごとに新しいメモリ ブロックを割り当てていることです。ただし、DestroyLinkedList() 関数で割り当てられたメモリ ブロックを解放していると確信しています。DestroyLinkedList() 関数のコードは次のとおりです。

void DestroyLinkedList(LinkedLists *ListPtr){
    LinkedListNodes* curNode = ListPtr->FrontPtr;
    LinkedListNodes* nextNode = curNode->Next;
    while(curNode != NULL){
        free(curNode);
        curNode = nextNode;
        if(curNode!=NULL){
            nextNode = curNode->Next;       
    }
}
 }

リスト ノードに割り当てられたメモリを解放する方法に問題はありますか?

4

2 に答える 2

0

リンクされたリストと data->word のデータを解放する必要があります (動的に割り当てられたと仮定します)。DestroyLinkedList で次のように実行できます。

void DestroyLinkedList(LinkedLists *ListPtr){
    LinkedListNodes* curNode = ListPtr->FrontPtr;
    LinkedListNodes* nextNode = curNode->Next;
    while(curNode != NULL){
        free(curNode->data->word);
        free(curNode->data);
        free(curNode);
        curNode = nextNode;
        if(curNode!=NULL){
            nextNode = curNode->Next;       
        }
    }
}
于 2012-09-28T22:52:54.333 に答える
0

だけLinkedListNodesでなく、追加のデータが含まれていますNext。そのデータも解放する必要があります。

void DestroyLinkedList(LinkedLists *ListPtr)
{
    if (!ListPtr) return; // Better safe than sorry

    LinkedListNodes* curNode = ListPtr->FrontPtr;
    while (curNode)
    {
        LinkedListNodes* nextNode = curNode->Next;
        free(curNode->WHATEVER); // Corresponds to theData

        // Other frees go here

        free(curNode);
        curNode = nextNode;
    }
}
于 2012-09-28T23:43:57.450 に答える