2012-09-28 26 views
0

我正在C中执行链表实现。程序从文件中读取数据中的数据并将其放入链表中,打印一些东西,然后删除链接列表并释放内存。然后我运行valgrind,它告诉我在我的文件中有内存泄漏。这里是我处理文件的代码:Valgrind告诉我在C中的内存泄漏,我敢肯定我已修复

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

如何'word'在你的结构分配呢? – coredump

+2

我没有看到任何免费()的ElementStructs分配在第一个片段。我猜这个curNode包含指向ElementStructs的指针,并且它没有被free(CurNode)释放。你应该添加类似free(curNode-> data)的东西以释放内存。 它有任何意义吗? – Dany

+0

Valgrind当然会告诉您一些比以下更具体的内容:_“我的文件中存在内存泄漏”_,对不对? – ninjalj

回答

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;  
     } 
    } 
} 
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; 
    } 
}