繁体   English   中英

释放链表

[英]freeing a linked list

我定义了一个链表如下

typedef struct uniquePattern{
  int pattern[*m]; 
  int position; 
  struct uniquePattern *previous;
  double backValues[]; 
}uniquePattern;

我将几个元素添加到列表中,以便第一个元素始终具有Previous = NULL。 然后,我尝试使用下一个功能释放内存。

  void free_ll(uniquePattern *head){
   uniquePattern *tmp;
    while (head != NULL){
     tmp = head;
     head = head->previous;
     free(tmp);
};

};

我没有错误。 但是,在教科书的示例中,作者在释放链表本身之前先释放链表的内容。 例如:

typedef struct names{
  char *name;
  struct names *previous;
};

如果名称指向字符串文字,则在删除结构之前先删除字符串文字可能是有意义的。

我的代码对吗? 我的推理对吗?

编辑:

double backValues[]; 包含一个数组,每次将元素添加到列表中时,数组的长度都会增加一个。 例如,如果用户要添加他曾访问过的城镇的坐标,而我需要计算欧几里得距离,则当用户添加第四个城镇时,backValue将为3,其中包括4-1 4-2和4之间的距离-3。

因此,我有一个计数器,该计数器知道列表中有多少个元素,例如, counter ,每次创建新元素时我分配更多的内存。 (counter-1)*sizeof(double) ,用于该数组。

我在分配结构的同时分配了数组(我没有两次调用malloc)。

您释放节点是正确的。 许多节点会将它们的数据作为指向自己进行malloc分配的其他区域的指针。 从您的评论来看,我认为您知道这一点。 查看您的结构,我有点担心double backValues[]

但是,您特别提到了字符串文字。 不,您不能free字符串文字,或者也许我应该说,如果尝试,则效果是不确定的。 字符串文字通常保存在某个地方的只读存储器中,而不是堆中。 您只应free使用malloccallocrealloc

但这可能是语义,如果用“字符串文字”表示在堆上已创建的字符数组( malloccallocrealloc ),那么可以,应在节点之前将其释放。 如果您不这样做,那么您将失去对指针的跟踪,并且内存泄漏。

如何为backValues分配内存? 我认为应该告诉我们。

如果结构内部有保存对某些已分配内存块的引用的指针,则需要先释放它们,然后再释放列表的节点。 例如,假设一个简单的节点定义:

typedef struct node_struct{
 int *arr;
 struct node_struct *next;
}node_t;

然后创建一个节点:

node_t tmp_node;
node_t *node_ptr;
node_ptr = &tmp_node;

您可以为整数数组“ arr”动态分配空间,如下所示:

node_ptr->arr = malloc(ARR_SIZE * sizeof(int));

在这种情况下,请确保在取消分配节点本身之前释放节点的动态分配的数组“ arr”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM