2016-04-25 48 views
1

有一件事我不確定,因此現在的問題,我希望標題在這裏確定。檢查內存請求兩次

讓我們首先檢查以下項目:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct person{ 
    char *fn; 
}; 

int main(void){ 
    struct person *pers; 

    pers = malloc(sizeof(struct person)); 
    if(pers == NULL){ 
     printf("No memory Avaible\n"); 
     exit(1); 
    } 

    pers->fn = malloc(10000000000000000); /*requesting a big chunk*/ 
    if(pers->fn == NULL){ 
     printf("No memory Avaible =>> [pers->fn]\n"); 
     free(pers); 
     exit(2); 
    } 


    strcpy(pers->fn, "Michi"); 
    pers->fn[strlen(pers->fn)] = '\0'; 

    printf("FN = %s\n",pers->fn); 

    if(pers->fn){ 
     free(pers->fn); 
    } 

    if(pers){ 
     free(pers); 
    } 
} 

輸出將是:

No memory Avaible =>> [pers->fn] 

因爲沒有可用內存,我做了免費的pers然後exit

if(pers->fn == NULL){ 
    printf("No memory Avaible =>> [pers->fn]\n"); 
    free(pers); 
    exit(2); 
} 

現在讓我們說我們有足夠的內存和親克做工精細,後者我們得出這樣的部分:

if(pers->fn){ 
    free(pers->fn); 
} 

if(pers){ 
    free(pers); 
} 

有,我應該檢查內存仍然存在任何保證? 或者我只是罰款:

free(pers->fn); 
free(pers); 
+1

記憶不存在的唯一原因是如果你或其他人爲你解救了它。當你退出不良分配時,價值必須在那裏。我只會在檢查是否有其他人爲你改變或釋放它的機會。順便說一句,'10000000000000000'溢出了malloc int,但我相信你知道這一點:) –

+0

因爲你的程序無條件地退出,如果** malloc()**是不成功的,沒有理由檢查退出。其他程序可能具有不同的邏輯流程,並且可能需要在退出時進行檢查。 –

+0

@MichaelDorgan我有辦法模擬:)) – Michi

回答

1

可以調用free()憑有效的內存指針,其通過malloc()分配,或零值。因此,只要您的指針是有效的或NULL,您在調用free()之前不必檢查。

+0

這我已經知道了,但問題是關於別的東西。請檢查@ MichaelDorgan的評論。 – Michi

1

無需在程序中的那一點檢查。如果前兩個malloc()成功,您只能到達那裏。

+0

基於這個事實,malloc成功了,不需要再次檢查內存......是的,我已經知道了,但問題是關於如果100%肯定/安全,如果不是,可能是什麼原因那。 – Michi

+1

沒有100%肯定/安全的東西。 CPU可能會被損壞,你可能有壞RAM或惡意軟件可以找到一些聰明的方式來跨越系統保護並侵入你的程序內存空間。但是在你分享的C代碼中,你是100%肯定/安全的代碼是有效的,在調用'free()'之前不需要進一步檢查。' – user590028

+0

這是我期待的答案。 – Michi