как освободить память, выделенную для malloc в следующем коде? - PullRequest
0 голосов
/ 02 декабря 2010
           int n;
           int **arr;
           arr = (int**)malloc(n*sizeof(int));
           for (i=0; i<n; ++i){
          arr[i] = malloc(2*sizeof(int));

          }

[РЕДАКТИРОВАТЬ]

      *** glibc detected *** ./abc: double free or corruption (out): 0x0000000002693370 
 ======= Backtrace: =========
 /lib/libc.so.6(+0x775b6)[0x7f42719465b6]
 /lib/libc.so.6(cfree+0x73)[0x7f427194ce53]
 ./abc[0x405f01]
 /lib/libc.so.6(__libc_start_main+0xfd)[0x7f42718edc4d]
 ./abc[0x400ee9]
 ======= Memory map: ========
00400000-00416000 r-xp 00000000 08:07 392882                             
 00616000-00617000 r--p 00016000 08:07 392882   

Я пытался ответить на следующие вопросы, но я получил следующую выше ошибку. В чем может быть причина?

[EDIT]

Вышеупомянутая проблема теперь решена.Так как в коде была ошибкаТеперь, что я не получаю, так это какого-либо улучшения в освобожденной памяти. Что может быть причиной этого?

[EDIT] Я использую некоторые модули для печати памяти. Ниже приведен код

     memory_Print();
     #ifdef CHECK
     memory_PrintLeaks();
      #endif

Здесь memory_PrintLeaks() печатает требуемую память и освобожденную память. Я получаю одинаковое значениепосле внесения изменений.

Еще одно замечание, которое я хотел бы добавить: могу ли я вызвать функцию free () в любом месте программы или требуется вызывать из определенных мест, например из того места, где malloc () был вызван или в конце программы?

Ответы [ 3 ]

6 голосов
/ 02 декабря 2010

С free. Сначала вы должны освободить память, на которую указывают записи arr[i], а затем, наконец, освободить память, на которую указывает arr (которая содержит эти записи). Вы не можете сделать это наоборот, потому что освобождение памяти означает, что вы больше не можете использовать значения, которые были в этой памяти.

Таким образом:

for (i = 0; i < n; ++i) {
    free(arr[i]);
}
free(arr);
1 голос
/ 02 декабря 2010

Вы должны пройти через arr и освободить arr[i], а затем освободите arr, когда закончите.Вам нужно столько же бесплатных вызовов, сколько и вызовов malloc.

1 голос
/ 02 декабря 2010
for (i=0; i<n; ++i){
    free(arr[i]);
}

free(arr);

Кстати, вы должны убедиться, что ваши выделения не провалились, по крайней мере, для arr, иначе вы бы в итоге разыменовали указатели NULL.

...