Как правило, вам нужно только освободить память, которая была зарезервирована для вас динамически.Это означает, что если у вас есть такой оператор:
int *my_int_pointer;
my_int_pointer = malloc(sizeof(int));
, то вам нужно освободить память, которая была выделена (зарезервирована) malloc.если вы не уверены, где его освободить, чем просто освободите его в конце программы, используя free;
free(my_int_pointer);
В вашем файле похоже, что будет выделяться память при появлении новой строки вфайл, который вы прочитали (в цикле while(done==0)
).поэтому каждый раз после if
в цикле this необходимо освобождать память, которая использовалась переменной.
Кроме того, вам нужно освобождать память, выделенную для переменной readline.Но, как было указано, до того, как у вас может появиться утечка памяти.
Надеюсь, это поможет.
edit: Хорошо - мне уже было интересно узнать о функции csestrcpy
.Давайте посмотрим на эту функцию:
char* csestrcpy2(char* src){
int i = 0;
char *dest;
char t;
dest = (char*) malloc(MAX_LINE); /*<<- This allocates memory that has to be freed*/
while( src[i] != '\0'){
dest[i] = src[i];
i++;
}
dest[i] = '\0';
//printf("length:%i\n",i);
free(dest); /* This frees the memory, but you return a pointer */
return dest; /* to this memory. this is invalid. */
}
Однако вы можете освободить указатель src в этой функции.но помните: указатель не может содержать информацию после освобождения основной памяти!Он просто указывает на место в памяти, где он не должен больше ни писать, ни читать.
Кроме того, функция копирует строку, пока нет '\ 0'.Что происходит, если терминатора нет?Функция продолжает копировать из некоторых адресов памяти, где она не должна!
Вы не должны использовать эту функцию;)