读书人

C语言free(void*)的有关问题

发布时间: 2012-11-12 12:31:57 作者: rapoo

C语言free(void*)的问题
在C Primer Plus(第五版)第十七章中有这样一段代码

C/C++ code
 /* Program done, so free allocated memory */ current = head; while (current != NULL) {      free(current);      current = current->next;  }  printf("Bye!\n");

head是一个指向一个链表的头元素的指针
这段代码的作用是释放这个链表malloc的内存
但是我有一个疑问:
current既然已经free了,怎么还能使用current->next呢?运行居然也是没报错的?为什么呢?
是不是应该改成
C/C++ code
 /* Program done, so free allocated memory */ current = head; while (current != NULL) {      head=current->next;      free(current);      current = head;  }  printf("Bye!\n");



[解决办法]
1、free只是释放了malloc所申请的内存,并不改变指针的值;
2、由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;
3、为了避免失误,最好在free之后,将指针指向NULL。
[解决办法]
没报错是偶然现象。
内存释放只是告诉OS该内存区域不再被本进程独占,可以被其它进程使用。至于数据是否马上被改变,要看OS的实际调度情况。

读书人网 >C语言

热点推荐