2016-11-28 4 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のを確認しています:私は、n個の*のはsizeof(int型)ここで、n> 1に再割り当てする場合

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 

リークが発生しない 私はこのコードを持っています。 なぜこれが起こっていますか?

+5

'mat'配列のサイズを小さくすると、' mat [i ]'ポインタの一部が失われてしまいます。すなわち 'mat [1]'と 'mat [2]'です。 – kaylum

答えて

3

matの配列サイズを小さくすると、mat[i]ポインタの一部が失われてしまいます。即ち、mat[1]及びmat[2]である。 reallocを実行する前に、reallocの縮小中に失われるポインタは、手動でfreeにする必要があります。

関連する問題