web-dev-qa-db-ja.com

getline()関数に関連するメモリを適切に解放するにはどうすればよいですか?

プログラミングを始めたばかりで、初心者の質問があります。長さが不明なファイルを1行ずつ読み取る関数を作成したいと思います。各行の長さがわからないので、getline()関数を使用しました。

_void readDict(FILE *dict_file){
  //Read dic 
  char *line;
  size_t len = 0, read;
  while((read = getline(&line, &len, dict_file))!=-1){
    check(line); 
  }
  free(line);
  return;
}
_

getline()malloc()realloc()の文字列に似ているので、この関数を使用して長さが不明な行をたくさん読み取るとしたら、メモリリークまたはメモリ不足が発生しますか?

9
woshidashen

まず、lineptrNULLに初期化する必要があります。適切な初期化がないと、lineptrに不確定な値が含まれるため、lineptrは無効なメモリ位置を指し、処理の後半で 未定義の動作 を呼び出します。 (realloc())適切な量のメモリを割り当てます。

次に、 manページ に従って、

[...] getline()を呼び出す前に、_*lineptr_には、サイズが_*n_バイトのmalloc()割り当てバッファへのポインタを含めることができます。バッファが行を保持するのに十分な大きさでない場合、getline()realloc()でサイズを変更し、必要に応じて_*lineptr_と_*n_を更新します。

したがって、同じ_*lineptr_を渡す限り、最後に1回だけfree()を渡せば問題ありません。

17
Sourav Ghosh