释放链表

时间:2013-11-17 16:59:17

标签: c malloc

我已经定义了一个链表如下

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

如果name指向字符串文字,那么在删除结构之前删除字符串文字可能是有意义的。

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

编辑:

double backValues[];包含一个数组,每次将一个元素添加到列表时,该数组会增加一个长度。例如,如果用户正在添加他访问过的城镇的坐标,并且我需要计算欧氏距离,那么当用户添加第四个城镇时,backValues将是长度3,包含4-1 4-2和4之间的距离-3。

所以我有一个计数器,知道列表中有多少元素,比如counter和每个元素  时间我在创建新元素时分配了更多的内存。 (counter-1)*sizeof(double),对于那个数组。

我在malloc结构的同时malloc数组(我不调用malloc两次)。

2 个答案:

答案 0 :(得分:2)

释放节点是正确的。许多节点会将数据作为指向其他malloc自身区域的指针。从你的评论来看,我想你知道。看看你的结构,我有点担心double backValues[]

但是你特别提到了一个字符串文字。不,你不能free一个字符串文字,或者我应该说,如果你尝试那么效果是不确定的。字符串文字通常保存在某个地方的只读内存中,而不是在堆上。您应该free使用malloccallocrealloc创建的内容。

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

如何为backValues分配内存?我想我们应该被告知。

答案 1 :(得分:1)

如果你在结构中有指针来保存对某个已分配内存块的引用,则需要在释放列表节点之前释放它们。 例如,假设一个简单的节点定义:

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”。