Утечка в FGES при назначении буфера
-
26-09-2019 - |
Вопрос
У меня проблемы с пониманием, почему следующие утечки кода в одном случае, а не в другом случае. Разница есть
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. Юридически звонит бесплатно на нулевой указатель, но, конечно, в этот момент вы потеряли оригинальный указатель.