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 回答