我在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;
}
}
}
我释放为列表节点分配的内存的方式有什么问题吗?
答案 0 :(得分:0)
您需要释放链接列表和data->字的数据(假设是动态分配的)。您可以通过执行以下操作在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;
}
}
}
答案 1 :(得分: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;
}
}