2016-11-28 71 views
0

我目前正試圖瞭解動態內存分配如何工作。 我有這樣的代碼:收縮矩陣與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; 
} 

我與Valgrind的檢查內存泄漏:

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 

如果我重新分配到n *的sizeof(INT),其中n> 1所述的泄漏不會發生。 這是怎麼回事?

+5

當你減少'mat'數組的大小時,你已經丟失了一些'mat [i]'指針。即'mat [1]'和'mat [2]'。 – kaylum

回答

3

當您減少mat數組大小時,指針會丟失一些mat[i]指針。即mat[1]mat[2]。在執行realloc之前,您需要手動free收縮realloc期間將丟失的任何指針。