2015-04-01 84 views
2

以下代碼是否會導致未定義的行爲?未定義的行爲fopen,fclose

FILE *fp; 
fopen_s(&fp, "abc.bin", "rb"); 
fclose(fp); 
fclose(fp); // accidentally closed an already closed file. 

我知道在一個已經釋放的數組上調用free會導致UB。所以我問。從man fclose

+0

這當然是未定義的行爲。 – 2015-04-01 20:08:46

+1

在複雜的情況下,是很難跟蹤,就像用'免費()'如果你設置的指針'在聲明中對NULL',和關閉或釋放後,可以再前檢查它的' fclose()'或'free()'調用來保存很多悲傷。 – 2015-04-01 20:12:14

+0

@WeatherVane:但不幸的是,與'free'不同的是,它沒有很好地定義用'NULL'指針調用'fclose'。我建議在'free'之前爲'NULL'檢查'是一件壞事。在調用'fclose'之前檢查'NULL'確實是一件好事。 – 2015-04-01 20:18:26

回答

6

引用:

FCLOSE的行爲()是未定義如果流參數是非法指針,或爲()已經傳遞給FCLOSE的先前調用的描述符。

所以,是的,它是不確定的行爲。

+0

POSIX也說,這是UB:http://pubs.opengroup.org/onlinepubs/009695399/functions/fclose.html – Brian 2015-04-01 20:10:17

+0

同意。一個實現總是可以在'fopen(_s)()'中使用'new/malloc'和''fclose()'中的'delete/free',或者它可以使用私有緩存,並且兩者都是合法的。調用者不應該對一個'FILE *'指針的有效性任何假設它傳遞給'FCLOSE後()',只是爲null,並將其移動。 – 2015-04-01 20:10:21

+0

爲什麼總是提示*流參數*?不使用流在這裏 – 2015-04-01 20:10:42