2016-11-28 3 views
0

Ich versuche derzeit zu verstehen, wie dynamische Speicherzuweisung funktioniert. Ich habe diesen Code:Shrink Matrix mit Realloc

int main() 
{ 
    int **mat, i; 

    mat = calloc(3, sizeof(int*)); 
    for(i = 0; i < 3; i++) 
     mat[i] = calloc(3, sizeof(int)); 

    mat = realloc(mat, 1*sizeof(int*)); 
    for(i = 0; i < 1; i++) 
     mat[i] = realloc(mat[i], 1*sizeof(int)); 

    for(i = 0; i < 1; i++) 
     free(mat[i]); 
    free(mat); 

    return 0; 
} 

Ich habe mit valgrind für Speicherlecks geprüft:

24 bytes in 2 blocks are definitely lost in loss record 1 of 1 
at 0x4C2C975: calloc (vg_replace_malloc.c:711) 
by 0x400605: main (main.c:10) 

LEAK SUMMARY: 
    definitely lost: 24 bytes in 2 blocks 
    indirectly lost: 0 bytes in 0 blocks 
    possibly lost: 0 bytes in 0 blocks 
    still reachable: 0 bytes in 0 blocks 
    suppressed: 0 bytes in 0 blocks 

Die Leckagen nicht auftreten, wenn ich n * sizeof (int), wobei n> 1 umverteilen. Warum passiert das?

+5

Wenn Sie die Array-Größe "mat" reduzieren, haben Sie einige der Zeiger "mat [i]" verloren. Nämlich 'mat [1]' und 'mat [2]'. – kaylum

Antwort

3

Wenn Sie die mat Array-Größe reduzieren, haben Sie einige der mat[i] Zeiger verloren. Nämlich mat[1] und mat[2]. Sie müssen manuell free alle Zeiger, die während der Schrumpf realloc vor der realloc verloren gehen.