一個指針釋放后不置空的后果:
free(p)之后原本那塊內存的數據已經被釋放了,內存重新收回。但此時的指針變量依然指向那塊內存,在以后的代碼中若不小心繼續調用指針變量,會出現不可預料的錯誤。
不置空的話,在后面由於無法檢測指針的合法性,很可能誤以為p合法,直接訪問有可能會造成程序崩潰。
我們在平時編程時,對空指針很容易檢測(if(NULL==p)),但是對於非法指針p不為空,我們是無法檢測到的(即野指針)。
防止對一個已經釋放的指針多次釋放造成程序崩潰,但是對一個null指針多次釋放是合法的。
所以,我們在free后一定要將指針置空!!!!!!
注意:
內存泄漏的情況的產生是:例如:用int* p=(int*)malloc(sizeof(int));讓p重新指向其它,這樣用malloc()開辟的空間就找不到了,造成內存泄漏。
代碼展示內存釋放之后指針的行為:
#include <stdio.h> #include <stdlib.h> int main() { // 申請有num個元素的整型數組 int num = 0; scanf("%d", &num); int* p = (int*)malloc(sizeof(int) * num); if (p == NULL) { printf("內存分配失敗\n"); } else { for (int i = 0; i < num; i++) { p[i] = i; printf("%d\n", p[i]); } // 內存釋放前后,指針的值不變 printf("%p\n", p); free(p); printf("%p\n", p); p = NULL; //內存釋放以后,要將指針置空(NULL),符合軟件工程規范 // printf("%d\n", p[2]); //內存置空,在程序測試時可以及時發現引用錯誤 } return 0; }