当我在curr->data
输入数据时,我首先通过curr = (NODE*) malloc (sizeof(NODE));
分配内存。然后我构建列表,最后在最后打印它。在程序的某个地方,我必须释放我用过的内存,但我不知道该怎么做。构建列表后,或打印列表后?或者我可以这样做吗?
printf("How many elements do you want to make? ");
scanf("%d", &NumElem);
head = NULL;
for (i = 0; i < NumElem; i++)
{
//memory allocate
curr = (NODE*)malloc(sizeof(NODE));
printf("Number %d: ", i+1);
scanf("%d", &curr->num);
FLUSH;
if (head == NULL)/*beginning of the list*/
{
curr->next = head;
head = curr;
*tail = curr;
}
else /*adding on the list*/
{
curr->next = head;
head = curr;
}
free (curr);
}//for
将数据放入当前节点后,每次都可以释放吗?
答案 0 :(得分:6)
假设您预订了一个本地会议室,您计划召开会议,然后举行派对。您何时会在预订之后,在您参加会议之后但在参加聚会之前,或在您参加了会议和聚会之后立即发布预订?
malloc
和free
就是这样...... malloc
保留一段内存供您使用,free
取消预订。如果在取消预订后继续使用内存,则行为未定义。
在您的情况下,您需要释放整个节点列表。您可以在循环中执行此操作,但是有一个共同的陷阱:在访问其next
指针之前释放节点。危险在于它几乎总是在实践中起作用,但它是未定义的,有时它不起作用......可能在一些控制生命关键机器的软件中。现在最好学会这样做:
void free_list(NODE* list)
{
while (list)
{
NODE* next = list->next;
free(list);
list = next;
}
}
或者稍微紧凑的形式,
void free_list(NODE* list)
{
for (NODE* next; list; list = next)
{
next = list->next;
free(list);
}
}
如果您的节点包含指向malloc
并且需要释放的字符串或其他对象的指针,那么这些免费调用将在free_list中完成,然后释放节点本身。