2013-04-25 84 views
7

下列塊導致內存泄漏:在1塊getline()失敗後,我需要調用free()嗎?

FILE *fp = fopen(path, "r"); 
char *line = NULL; 
size_t len = 0; 
ssize_t read = -1; 

while ((read = getline(&line, &len, fp)) != -1) { 
     /*Do something*/ 
} 

120個字節肯定丟失...

...函數getline(getline.c:34)

我可以通過添加一個free()來解決此問題:

while ((read = getline(&line, &len, fp)) != -1) { 
     /*Do something*/ 
} 
free(line); 

我的問題是:爲什麼getlineline分配內存時失敗?爲什麼我不需要free(line)每次調用getline

回答

9

設置是這樣的,您可以將先前分配的內存塊傳遞給getline(),如果需要它將分配更多(realloc())。 (或者你可以不分配,這裏的內存開始)。它可以報告故障或EOF,但不會釋放被分配的空間 - 因此你需要釋放它。如果文件是空文件,並且您沒有數據,則可能無法分配任何空間;另一方面,它可能在嘗試從文件中獲取數據之前已經分配了一些空間。

但你知道,如果line指針不爲空,它被分配的,必須被釋放。

+4

+1'man 3 getline',雖然相當模糊,但沒有任何關於它必須*成功分配緩衝區的權限。它只是讀取*「如果* lineptr爲NULL,則getline()'將分配一個緩衝區來存儲該行,這應該由用戶程序釋放。」* – WhozCraig 2013-04-25 00:35:27

2

函數getline可以用幾種不同的方式失敗,它們可能會失敗時可能沒有realloced內存一次或多次。爲了保持一致性,它永遠不會釋放內存 - 請參閱http://www.opensource.apple.com/source/cvs/cvs-19/cvs/lib/getline.c

一種可能的實現方式這種一致性使實現和調用者都更容易...您只需總是自由行而不必檢查錯誤代碼來查看是否釋放它。