簡體   English   中英

在失敗的getline()之后我需要調用free()嗎?

[英]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);

我的問題是 :為什么getlineline失敗時為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM