7

次のブロックは、メモリ リークを引き起こします。

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そして、なぜ私はfree(line)すべての呼び出しに対してする必要がないのgetlineですか?

4

2 に答える 2

9

セットアップは、以前に割り当てられたメモリ ブロックを に渡すことができるようなものであり、必要に応じてgetline()さらに割り当てます ( )。realloc()(または、こちらのように、メモリを割り当てずに開始することもできます。) 失敗または EOF を報告できますが、割り当てられたスペースは解放されません。したがって、解放する必要があります。ファイルが空のファイルで、データがない状態で開始すると、スペースが割り当てられない可能性があります。一方、ファイルからデータを取得しようとする前に、ある程度のスペースが割り当てられている可能性があります。

lineしかし、ポインターが null でない場合は、ポインターが割り当てられており、解放する必要があることがわかります。

于 2013-04-25T00:30:50.903 に答える
2

getline はいくつかの異なる方法で失敗する可能性があり、失敗したときにメモリを 1 回以上再割り当てした場合とそうでない場合があります。一貫性を保つために、メモリを解放することはありません

このような一貫性により、実装と呼び出し元の両方にとって簡単になります...エラーコードをチェックして解放するかどうかを確認する必要はなく、常に行を解放するだけです。

于 2013-04-25T00:53:32.693 に答える