我已经定义了一个链表如下
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两次)。
答案 0 :(得分:2)
释放节点是正确的。许多节点会将数据作为指向其他malloc
自身区域的指针。从你的评论来看,我想你知道。看看你的结构,我有点担心double backValues[]
。
但是你特别提到了一个字符串文字。不,你不能free
一个字符串文字,或者我应该说,如果你尝试那么效果是不确定的。字符串文字通常保存在某个地方的只读内存中,而不是在堆上。您应该free
使用malloc
,calloc
或realloc
创建的内容。
但这可能是语义,如果用“字符串文字”表示在堆上创建的字符数组(malloc
,calloc
,realloc
)那么是的,它应该在节点之前释放。如果不这样做,那么你将失去对指针的跟踪,并且你有内存泄漏。
如何为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”。