2016-11-07 4 views
0

Я сделал 2d-массив (матрицу) + alloc и бесплатные функции для управления памятью, но он не работает хорошо, valgrind печатает много ошибок и информации, что память была потеряна.alloc и без 2d-массива

Alloc: Parametr s означает размер матрицы

int** alloc(int s) 
{ 
    int** matrix; 
    int i; 

    matrix = (int**)malloc(s * sizeof(int*)); 
    for (i = 0; i < s; i++) 
    { 
     matrix[i] = calloc(s, sizeof(int)); 
    } 

    return matrix; 
} 

Free

void matrix_free(int*** matrix, int s) 
{ 
    int i; 
    for(i = 0; i < s; i++) 
    { 
     free(*((matrix)+i)); 
    } 
    free(matrix); 

} 

Valgrind: Многие ошибки, как это:

Invalid read of size 8 
==3767== at 0x4FAA8D4: buffer_free (in /lib/x86_64-linux-gnu/libc-2.24.so) 
==3767== by 0x4FAA942: __libc_freeres (in /lib/x86_64-linux-gnu/libc-2.24.so) 
==3767== by 0x4A276EC: _vgnU_freeres (in /usr/lib/valgrind/vgpreload_core-amd64-linux.so) 
==3767== by 0x4E73292: __run_exit_handlers (exit.c:98) 
==3767== by 0x4E73339: exit (exit.c:105) 
==3767== by 0x4E593F7: (below main) (libc-start.c:325) 
==3767== Address 0x52000e8 is 168 bytes inside a block of size 552 free'd 
==3767== at 0x4C2DD6B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==3767== by 0x108BBB: matrix_free (m1.c:68) 
==3767== by 0x108B69: main (m1.c:58) 
==3767== Block was alloc'd at 
==3767== at 0x4C2CB3F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==3767== by 0x4EA7F2C: __fopen_internal (iofopen.c:69) 
==3767== by 0x108919: main (m1.c:16) 
==3767== 
==3767== 
==3767== HEAP SUMMARY: 
==3767==  in use at exit: 36 bytes in 3 blocks 
==3767== total heap usage: 7 allocs, 6 frees, 5,732 bytes allocated 
==3767== 
==3767== LEAK SUMMARY: 
==3767== definitely lost: 36 bytes in 3 blocks 
==3767== indirectly lost: 0 bytes in 0 blocks 
==3767==  possibly lost: 0 bytes in 0 blocks 
==3767== still reachable: 0 bytes in 0 blocks 
==3767==   suppressed: 0 bytes in 0 blocks 
+2

Просьба представить [mcve] включая вызовы этих функций, которые могут воспроизвести проблему. – kaylum

+1

Для начала 'int *** matrix' выглядит подозрительно. Матрица выделяется как 'int **', но как-то свободный освобождает 'int ***'. Поэтому, пожалуйста, предоставьте MCVE, чтобы мы могли видеть код в контексте, и тогда мы можем дать окончательный ответ. – kaylum

+0

'matrix_free' выглядит не так. Вы передаете 'int ***', поэтому 'free' в вашем цикле 'for' должны иметь' ** 'разыменование, а окончательный' free' должен быть 'free (* matrix);' – yano

ответ

1

Свободная функция в этом случае Безразлично» t возьмите указатель, указывающий на выделенную память, но указатель на этот указатель.

Чтобы освободить память, вам необходимо сначала получить этот указатель.

void matrix_free(int*** matrix, int s) 
{ 
    int** m = *matrix; 
    int i; 
    for(i = 0; i < s; i++) 
    { 
     free(m[i]); 
    } 
    free(m); 

    *matrix = NULL; 
} 

Этот вариант также позволяет установить аргумент NULL:

matrix_free(&matrix , s); 
assert(matrix == NULL);