2016-11-07 11 views
0

메모리를 관리하기 위해 2 차원 배열 (행렬) + 할당 및 자유 함수를 만들었지 만 제대로 작동하지 않는 경우 valgrind는 많은 오류와 메모리가 손실되었다는 정보를 인쇄합니다.2 차원 배열을 할당하고 사용하지 않음

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; 
} 

무료 행렬의 크기를 의미

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] 입력하십시오 :

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의 인수를 설정할 수 있습니다. – kaylum

+1

처음에는'int *** matrix'가 의심 스럽습니다. 행렬은'int ** '로 할당되지만, 여하튼 자유는'int ***'를 내 놓는다. MCVE를 제공하여 문맥에서 코드를 볼 수있게하고 결정적인 답을 줄 수 있습니다. – kaylum

+0

'matrix_free'가 올바르게 보이지 않습니다. 당신은'int *** '에 전달하고 있으므로'for' 루프의'free'는'**' 참조를 가져야하고 마지막은'free (* matrix);가되어야합니다 – yano

답변

1

이 경우 무료 기능은 '아무튼 할당 된 메모리를 가리키는 포인터를 취하지 만, 그 포인터를 가리키는 포인터.

메모리를 확보하려면 먼저 포인터를 가져와야합니다.

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