2016-11-28 6 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 

Утечки не произойдет, если я перераспределить в п * SizeOf (INT), где п> 1. Почему это происходит?

+5

Когда вы уменьшаете размер массива 'mat', вы потеряли некоторые указатели' mat [i] '. А именно 'mat [1]' и 'mat [2]'. – kaylum

ответ

3

Когда вы уменьшаете размер массива mat, вы потеряли некоторые указатели mat[i]. А именно mat[1] и mat[2]. Вам необходимо вручную указать free любые указатели, которые будут потеряны во время усадки realloc перед выполнением realloc.