我有一个结构体如下:
struct Node{
int *arr;
int *sol;
struct Node *Next;
};
我用这种方式创建Node:
Node* MyNode = (Node *)malloc(sizeof (struct Node));
MyNode->arr = malloc(sizeof(int)*N);
MyNode->sol= malloc(sizeof(int)*N);
然后将MyNode添加到链表中。如何为列表中的元素释放内存?
这是正确的吗?
pop(){
free(first->arr);
free(first->sol);
first=first->Next;
}
要使struct
成为linked-list
中的节点,则需要将self-referential structure variable
声明为struct Node *next;
struct Node{
int *arr;
int *sol;
struct Node *next;
}
要为链表的一个节点分配内存,您需要以下配置:
/* allocate memory for a node */
struct Node * MyNode = (struct Node *)malloc((int)sizeof(struct Node));
if (MyNode == NULL) {
printf("ERROR: unable to allocate memory n");
return 1;
}
/* allocate memory for the content of a node */
MyNode->arr = (int *) malloc((int)sizeof(int) * N);
if (MyNode->arr == NULL) {
printf("ERROR: unable to allocate memory n");
return 1;
}
MyNode->sol = (int *) malloc((int)sizeof(int) * N);
if (MyNode->sol == NULL) {
printf("ERROR: unable to allocate memory n");
return 1;
}
/* add the new node to a list by updating the next variable */
MyNode->next = ...
如果您不确定需要执行哪些操作来删除链表中的节点,您可以使用temp
变量以更简单的方式完成相同的操作。
pop()
{
struct Node * temp = first;
first = first->next;
free(temp->arr);
free(temp->sol);
free(temp);
}
free
的经验法则——每个malloc()
都应该有一个free()
OTOH,要了解在链表中删除节点的各种场景,请参考此链接。
几乎,您需要释放节点本身:
pop(){
Node* old_first = first;
free(first->arr);
free(first->sol);
first=first->Next;
free(old_first);
}
pop(){
free(first->arr);
free(first->sol);
Node* temp = first; //<========
first=first->Next;
free (temp); //<=======
}
这很接近但不正确-你应该有尽可能多的free
和malloc
。你忘了释放Node
本身。
要修复它,添加一个临时的:
Node *next = first->next;
free(first->arr);
free(first->sol);
free(first);
first = next;