Как исправить утечку памяти при вызове calloc - PullRequest
0 голосов
/ 25 мая 2019

Моя программа читает файл (test.txt, и он содержит только 2 строки и пробел, например: «Hello World»), и когда я использую calloc, это вызывает утечку памяти при использовании valgrind.Проблема в том, что я получил больше байтов, потерянных во втором выделении памяти (b = calloc (11, sizeof (* b)).

Я попытался использовать free (), это не сработало

    char str[1024];
    char *a = NULL;
    char *a = NULL;
    int i = 0;
    while(!feof(myfile)) {
       //I used some codes here to skip "\r\n" which is working fine.
       fscanf(myfile, "%10s", str);
       i = strlen(str);
       if(key_find(k,str) == NULL){
         a = calloc(i,sizeof(*a));
         strcpy(a,str);
         key_insert(k,a);
       }
       fscanf(myfile, " ");
       fscanf(myfile, "%10s", str);
       if(key_find(k,str) == NULL){
         b = calloc(i,sizeof(*a));
         strcpy(b,str);
         key_insert(k,a);
       }
    }
   free(a); free(b);

Это не дает мне никакой утечки памяти, когда у меня есть только 2 разные строки в моем текстовом файле. Но если у меня есть больше чем 4 строки, то это дает мне утечку памяти.

1 Ответ

0 голосов
/ 25 мая 2019

Во время выполнения вам нужно сделать столько же бесплатных, сколько вы сделали в callocs.Если calloc находится внутри цикла, free также должен быть внутри цикла, например:

 a = calloc(i,sizeof(*a));
 strcpy(a,str);
 key_insert(k,a);
 free(a); /* you need to free a when it is not needed */

Тогда

 b = calloc(i,sizeof(*a));
 strcpy(b,str);
 key_insert(k,a); /* you should probably replace this by key_insert(k,b) */
 free(b); /* don't need b anymore? free it! */
...