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的实际调度情况。