[英]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
使用malloc
, calloc
或realloc
。
但这可能是语义,如果用“字符串文字”表示在堆上已创建的字符数组( malloc
, calloc
, realloc
),那么可以,应在节点之前将其释放。 如果您不这样做,那么您将失去对指针的跟踪,并且内存泄漏。
如何为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.