【问题标题】:How to free a linked list?如何释放链表?
【发布时间】:2013-10-30 13:48:27
【问题描述】:

我在一个函数中创建了一个链表,并且在程序的其余部分中,我使用指针访问该列表。现在我将如何在我的程序结束时释放这个链接列表?我是直接使用free(CircuitData) 还是必须遍历列表以释放每个节点?写这篇我想释放每个节点是显而易见的答案......

顺便说一句,我还想问一下如何找出在程序期间分配的所有内存是否都被正确释放了?

 ListNodeType *CircuitData;
 CircuitData = NULL;
 ReadFile(&CircuitData, &numEl, &numNodes);


void ReadFile(ListNodeType **CircuitData, int *numEl, int *numNodes){

    ListNodeType *newPtr, *tempPtr;
    newPtr = malloc(sizeof(ListNodeType));
    *CircuitData = newPtr;
    newPtr->nextPtr = NULL;

    //MORE CODE

【问题讨论】:

  • 对于您的第一个问题,根据您分配的片段,释放每个节点。实际上,它取决于列表的分配方式(显然)。一些链接列表是在静态缓冲区中完成的,但您的肯定似乎遵循规则而不是例外。

标签: c linked-list malloc free


【解决方案1】:

对于每个malloc,您都需要一个free,否则您会泄漏内存。分析程序以查看是否存在内存泄漏的一种可能方法是使用Valgrind

【讨论】:

    【解决方案2】:

    对于您的第一个问题,是的,您应该遍历列表并free 每个节点。

    第二个问题有点难回答。如果您在内存中有一个对象,但无法访问它,那就是内存泄漏。

    您可以使用一些工具来分析您的内存池。查看 valgrind:

    http://valgrind.org/

    【讨论】:

      【解决方案3】:

      我认为你可以这样做:

      void freeFunction(ListNodeType *CircuitData)
      {
          void *victim;
      
          while (CircuitData)
          {
              victim = CircuitData;
              CircuitData = CircuitData->next;
              free(victim);
          }
      }
      

      【讨论】:

      • 这是准确的,尽管您不需要tmp。只需与CircuitData 一起走。没有理由保留它的原始价值,因为无论如何你都在摧毁它曾经指向的一切。如果正确完成,则不需要最后一个 if 子句。
      • 没错tmp 没用,但我只是为了理解;)
      • 正如所写的那样,如果传入的列表为空,它将释放()最后一个节点,更糟糕的是,释放()一个不确定的(读取:无效)指针。最后一个if 块根本不应该在那里。 编辑: 必须修复它,这是错误的,并且出于某种原因无论如何都会获得赞成票。
      • @WhozCraig 我试过了,然后在调用该函数后,我尝试打印 CircuitData 的一个元素,但它仍然打印了以前的值。它不应该打印乱码吗?
      • @Andre 甚至在指针被释放后访问该元素都是未定义的行为。那仍然有一些/大部分内存中的数据只是库free() 管理它的方式。在大多数情况下,free() 库只是将块重新添加到空闲列表中,并使其可供将来分配。
      【解决方案4】:

      我会想到这样的事情:

      struct node
      {
          int data;
          node* next;
      } *head;
      
      void deleteAllNodes(node* start)
      {
          while (start != NULL)
          { 
              node* temp = start; 
              start = start -> next;
              free(temp);
          }
      }
      

      【讨论】:

      • delete 是一个 c++ 结构,而不是 c
      • 进行下一个项目后不是要free吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2011-09-19
      相关资源
      最近更新 更多