Вопрос освобождения памяти списка утечек / утечки памяти - PullRequest
0 голосов
/ 26 марта 2020

У меня есть утечка памяти в одной функции, я не понимаю, почему это происходит, и не знаю, как это исправить. Назначение функции - перестроить связанный список в соответствии со значениями key1, он работает совершенно нормально, но по какой-то причине у него есть утечка памяти / я не освобождаю его должным образом

void ascending1 (Node * node, int A){
    int i = 0;
    double Temp_Key1[A];
    int Temp_Val[A];
    double Temp_Key2[A];
   double temp2 = 0;
    double temp3 = 0;
    int temp1 = 0;
    int amount = 0;
    int x = 0;

    for ( i = 0; i < A; i++ ){
        Temp_Key1[i] = 0;
        Temp_Key2[i] = 0;
        Temp_Val[i] = 0;
    }

    Node *sort1_head;
    sort1_head = NULL;
    for (i = 0; i<A ; i++ ){
        Temp_Key1[i] = node->key1;
        Temp_Key2[i] = node->key2;
        Temp_Val[i] = node->value;
        node = node->next;
    }

    amount = A-1;
    while (x<=amount){
     for (i = 0; i<A ; i++ ){

         if (Temp_Key1[i] < Temp_Key1[i+1]){
             temp2 = Temp_Key1[i];
             Temp_Key1[i] = Temp_Key1[i+1];
             Temp_Key1[i+1] = temp2;

             temp3 = Temp_Key2[i];
             Temp_Key2[i] = Temp_Key2[i+1];
             Temp_Key2[i+1] = temp3;

             temp1 = Temp_Val[i];
            Temp_Val[i] = Temp_Val[i+1];
            Temp_Val[i+1] = temp1;
         }
    }
        x++;
    }

    for ( i = A ; i >= 0 ; i--){
      node = malloc(sizeof(Node));
      node->value = Temp_Val[i];
      node->key1 =  Temp_Key1[i];
      node->key2 =  Temp_Key2[i];
      node->sort1 = sort1_head;  
      sort1_head = node;
      }

    printf("\n");
    printf("Following the sort1 links:\n");
    print_list1(node);
    sort1_head = NULL;
    free_list(node);
}

Функция, которая освобождает его

 void free_list(Node * head){
    Node * new_head = head;
    Node * old_node = NULL;

    while (new_head != NULL){
        old_node = new_head;
        new_head = new_head->next;
        free(old_node);
    }

}

Valgrind дает мне следующую ошибку:

==20167== Conditional jump or move depends on uninitialised value(s)
==20167==    at 0x10928C: free_list (FuncDef.c:19)
==20167==    by 0x109B24: ascending1 (FuncDef.c:199)
==20167==    by 0x10922D: main (main.c:26)
==20167==  Uninitialised value was created by a heap allocation
==20167==    at 0x483577F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==20167==    by 0x109A75: ascending1 (FuncDef.c:181)
==20167==    by 0x10922D: main (main.c:26)
==20167== 
==20167== 
==20167== HEAP SUMMARY:
==20167==     in use at exit: 48 bytes in 1 blocks
==20167==   total heap usage: 6 allocs, 5 frees, 2,240 bytes allocated

1 Ответ

0 голосов
/ 26 марта 2020

Ваши циклы неверны:

for (i = 0; i<A ; i++ ){
   if (Temp_Key1[i] < Temp_Key1[i+1]){

, но для i есть A-1, нет Temp_Key1[i+1], т. Е. Нет Temp_Key1[A].

То же самое для вашего l oop

for ( i = A ; i >= 0 ; i--){
    node->value = Temp_Val[i];

нет Temp_Val[A].

Просто измените на

for (i = 0; i<A-1 ; i++ ){

и

for ( i = A-1; i >= 0 ; i--){
...