0

我正在使用链表结构中的两种free()“ing ”内存的方法。malloc()假设我用下面的 C 代码创建了一个单链表;

#include<stdio.h>
#include<stdlib.h>

struct node_type{
  int data;
  struct node_type *next;
  struct node_type *prev;
}
typedef struct node_type node; 
typedef struct node_type *list; 

void main(void){
  list head,node1,tail;
  head=(list)malloc(sizeof(node));
  tail=(list)malloc(sizeof(node));
  node1=(list)malloc(sizeof(node));
  head->next=node1;tail->prev=node1;
  node1->prev=head;node1->next=tail;node1->data=1;

  /*Method-1 for memory de-allocation*/
  free(head->next->next);
  free(head->next);
  free(head);

  /*OR*/

  /*Method-2 for memory de-allocation*/
  free(tail);
  free(node1);
  free(head);

  /*OR*/

  /*Method-3 for memory de-allocation*/
  free(node1);
  free(tail);
  free(head); 
}

现在,我有以下问题:

Q1) 上面代码中显示的三种内存释放方法中哪一种是正确/错误的。

Q2) 是否有必要按照free()方法 1 和 2 中使用的 'ing 内存中的任何顺序进行内存解除分配或随机free()'ing 内存也可以?

4

3 回答 3

2

您展示的所有方法都是正确的,只有当指向已分配内存的指针仅存在于另一个已分配内存中时,您才应遵循特定顺序,如果您先释放容器,您将丢失它。

例如,对于分配:

int ** ipp;
ipp = malloc(sizeof(int*));
*ipp = malloc(sizeof(int));

正确的free顺序是:

free(*ipp);
free(ipp);

不是

free(ipp);
free(*ipp); // *ipp is already invalid
于 2012-05-14T18:56:08.620 回答
1

所有这些方法都可以正常工作。您可以按照您喜欢的任何顺序释放由 malloc 分配的内存块。

试想一下,当您释放它时,您分配内存的顺序必须颠倒过来。如果是这样,您将永远无法从列表中间插入或删除项目。您唯一可用的动态分配数据结构将是下推堆栈。

于 2012-05-14T18:55:00.803 回答
1

这是一种从头部开始释放链表的简单方法。(注意,如果您在列表的末尾,这假设“next”将为 NULL。)

node * it = head;
while( NULL != it ) {
  node * tmp = it;
  it = it->next;
  free(tmp);
}
于 2012-05-14T18:58:02.270 回答