Вопрос

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

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);  


}
Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top