2016-10-02 83 views
5

我寫這樣的代碼:ptr = free(ptr),NULL安全嗎?

#include <stdlib.h> 

int main(void) 
{ 
    void *kilobyte; 
    kilobyte = malloc(1024); 
    kilobyte = NULL, free(kilobyte); 
    return 0; 
} 

的對稱性,這是很好的。但我從來沒有見過任何人使用之前這個成語,所以,我不知道這實際上可能是不可移植/不安全的,儘管這Wikipedia報價:

In the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).


編輯:混合起來的順序。現在它編譯在gcc沒有任何警告。

+0

'free'沒有返回值,所以該行不良作風。代碼甚至沒有更少的輸入,使用標準的代碼。 – Olaf

+0

AFAIK,逗號運算符丟棄'free'值,這是'void',並使用'NULL'代替。如果你的風格需求在釋放它們之後始終將指針指向NULL,那麼它**少輸入。 –

+0

丟棄沒有價值!你有沒有試圖在問之前編譯這個?你有沒有在標準中找到合法或非法的證據?請引用該部分。 (哦,我用gcc嘗試過)。 – Olaf

回答

11

通過這樣做:

kilobyte = NULL, free(kilobyte); 

您有內存泄漏。

您設置kilobyte爲NULL,所以不管它的內存被指向不再在任何地方引用。然後當你做free(kilobyte)時,你實際上在做free(NULL),它不執行任何操作。

關於free(NULL),從C standard

7.22.3.3 The free function

1.

#include <stdlib.h> 
void free(void *ptr); 

2. The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

至於編輯之前,你的原始代碼:

kilobyte = free(kilobyte), NULL; 

這樣做的問題是,=操作符比,運營商更高的優先級,所以這個說法實際上是:

(kilobyte = free(kilobyte)), NULL; 

這試圖設置這是不允許到void的變量。

什麼你可能縮進做的是:

kilobyte = (free(kilobyte), NULL); 

這釋放的指針,然後將指針設置爲NULL。

正如意見中提到的奧拉夫,而不是一條線做的一切,但最好要做到這一點,而不是:

free(kilobyte); 
kilobyte = NULL; 

這樣做,這是比冷凝代碼爲更清楚地向讀者其他人可能不瞭解,並且(如您現在所見)不太容易出錯。

相關問題