【问题标题】:How do we free memory of node carrying pointer to some location我们如何释放带有指向某个位置的指针的节点的内存
【发布时间】:2011-12-15 05:58:38
【问题描述】:

我有链接列表,其节点结构如下所示

  struct node
  {
  char *p;
  struct node *next;
  }*start;

现在我们 char *p 是指向由 malloc 调用分配的内存位置的指针。同样,整体也是使用 malloc 分配的。现在想释放两个 malloc 调用占用的空间,如下所示

  main()
 {
   struct node *tmp;
   tmp=malloc(sizeof(struct node));
   tmp->next=NULL;
   tmp->p=malloc(2*sizeof(int));

   free(tmp->p);
   free(tmp);

 }

这是释放内存的正确方法还是这里需要什么?

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    这是正确的方法,但不要忘记在使用free之后将指针分配给NULL,否则指针将成为悬空指针。

    像这样使用它们 -

    免费(tmp->p); tmp->p = NULL;

    【讨论】:

    • 是的,关于 tmp->p-NULL 点绝对没问题,但只是想知道如果我们不使用 tmp->p=NULL 语句,是否会出现分段错误?
    • 不,在这种情况下没有段错误的机会,因为你没有取消引用悬空指针。只是代码中存在悬空指针不会导致段错误。当您由于诚实的错误而尝试使用悬空指针时,就会发生段错误。如果您在释放节点后尝试取消引用节点内的指针 p,则可能会发生段错误。这样的事情会导致 segfault -> free(tmp->p); *(tmp->p); // 段错误。
    • 我试图打印这个声明 *(tmp->p) nd 仍然逃脱了分段错误
    • 实际上一旦你释放了内存之后你就不应该使用它,否则会导致未定义的行为,但这并不意味着你不能使用它。这里发生的情况是内存已释放,但仍未再次分配,因此您不会收到任何段错误。
    【解决方案2】:

    您正在正确释放,尽管通常您会有一个指向第一个节点的指针,然后通过跟随指针循环遍历列表。例如

    struct node *first;
    ... list created, first pointing to first in list, where last next is == NULL ...
    
    while (first != NULL) 
    {
      struct node* next = first->next;
      free( first->p );
      free( first );
      first = next;
    }
    

    顺便说一句,您为什么将p 声明为char* 但分配整数?错别字?

    【讨论】:

    • 你看到 Amelioration 提出的观点了吗,释放后将指针分配给 NULL ?你不觉得他说的很重要吗
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多