2016-11-28 31 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期间将丢失的任何指针。