утечка в fgets при назначении в буфер - PullRequest
4 голосов
/ 13 мая 2010

У меня проблемы с пониманием, почему следующий код протекает в одном случае, а не в другом. Разница составляет

while(NULL!=fgets(buffer,length,file))//doesnt leak
while(NULL!=(buffer=fgets(buffer,length,file))//leaks

Я думал, что это будет то же самое.

Полный код ниже.

#include <stdio.h>
#include <stdlib.h>

#define LENS 10000

void no_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=fgets(buffer,LENS,fp)){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
void with_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=(buffer=fgets(buffer,LENS,fp))){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}

Ответы [ 4 ]

7 голосов
/ 13 мая 2010

Потому что вы переназначаете какой буфер использовался для указания. К тому времени, когда вы достигнете free(buffer); в конце кода, буфер будет указывать на NULL (потому что это то, что вы проверяли, чтобы выйти из цикла while), и, следовательно, когда вы вызываете free, вы не Вы называете это по оригинальному указателю, вы malloc, вы называете это ни о чем.

2 голосов
/ 13 мая 2010

Если fgets() возвращает NULL, buffer теряет свое первоначальное значение, поэтому вы больше не можете free его.

1 голос
/ 13 мая 2010

Вы получите утечку, когда fgets вернет NULL. Разрешается бесплатный вызов по нулевому указателю, но к этому моменту вы потеряли свой первоначальный указатель.

1 голос
/ 13 мая 2010

При успешном чтении все будет хорошо. Но когда будет достигнут конец файла, fgets вернет NULL, поэтому буфер будет иметь значение NULL, и вы не сможете его освободить.

...