free()函數釋放內存后的指針行為


一個指針釋放后不置空的后果:

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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM