[英]Do I need to call free() after a failed getline()?
以下塊導致內存泄漏:
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*/
}
1個塊中的120個字節肯定丟失了......
... getline(getline.c:34)
我可以通過添加free()
來解決這個問題:
while ((read = getline(&line, &len, fp)) != -1) {
/*Do something*/
}
free(line);
我的問題是 :為什么getline
在line
失敗時為line
分配內存? 為什么我不需要為getline
每次調用free(line)
?
設置是這樣的,您可以將先前分配的內存塊傳遞給getline()
,如果需要,它將分配更多( realloc()
)。 (或者你可以從沒有分配內存開始,如此處。)它可以報告失敗或EOF,但不釋放已分配的空間 - 因此你需要釋放它。 如果文件是空文件而您沒有數據,則可能無法分配任何空間; 另一方面,它可能在嘗試從文件中獲取數據之前分配了一些空間。
但是你知道如果line
指針不為null,它就被分配了,必須被釋放。
getline可能以幾種不同的方式失敗,並且可能會或可能不會在內存失敗時重新分配內存一次或多次。 為了保持一致,它永遠不會釋放內存 - 請參閱http://www.opensource.apple.com/source/cvs/cvs-19/cvs/lib/getline.c中的一個可能的實現。
這種一致性使得實現和調用者都更容易......你只需要釋放行而不必檢查錯誤代碼以查看是否釋放它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.