簡體   English   中英

分配和釋放二維數組

[英]alloc and free of 2d array

我制作了2d array(matrix)+ alloc和free函數來管理內存,但是它不能很好地工作,valgrind會打印許多錯誤和內存丟失的信息。

Alloc:參數表示矩陣的大小

int** alloc(int s)
{
    int** matrix;
    int i;

    matrix = (int**)malloc(s * sizeof(int*));
    for (i = 0; i < s; i++)
    {
        matrix[i] = calloc(s, sizeof(int));
    }

    return matrix;
}

自由

void matrix_free(int*** matrix, int s)
{
    int i;
    for(i = 0; i < s; i++)
    {
        free(*((matrix)+i));
    }
    free(matrix);

}

Valgrind:許多錯誤是這樣的:

Invalid read of size 8
==3767==    at 0x4FAA8D4: buffer_free (in /lib/x86_64-linux-gnu/libc-2.24.so)
==3767==    by 0x4FAA942: __libc_freeres (in /lib/x86_64-linux-gnu/libc-2.24.so)
==3767==    by 0x4A276EC: _vgnU_freeres (in /usr/lib/valgrind/vgpreload_core-amd64-linux.so)
==3767==    by 0x4E73292: __run_exit_handlers (exit.c:98)
==3767==    by 0x4E73339: exit (exit.c:105)
==3767==    by 0x4E593F7: (below main) (libc-start.c:325)
==3767==  Address 0x52000e8 is 168 bytes inside a block of size 552 free'd
==3767==    at 0x4C2DD6B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3767==    by 0x108BBB: matrix_free (m1.c:68)
==3767==    by 0x108B69: main (m1.c:58)
==3767==  Block was alloc'd at
==3767==    at 0x4C2CB3F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3767==    by 0x4EA7F2C: __fopen_internal (iofopen.c:69)
==3767==    by 0x108919: main (m1.c:16)
==3767== 
==3767== 
==3767== HEAP SUMMARY:
==3767==     in use at exit: 36 bytes in 3 blocks
==3767==   total heap usage: 7 allocs, 6 frees, 5,732 bytes allocated
==3767== 
==3767== LEAK SUMMARY:
==3767==    definitely lost: 36 bytes in 3 blocks
==3767==    indirectly lost: 0 bytes in 0 blocks
==3767==      possibly lost: 0 bytes in 0 blocks
==3767==    still reachable: 0 bytes in 0 blocks
==3767==         suppressed: 0 bytes in 0 blocks

在這種情況下,free函數不使用指向已分配內存的指針,而是指向該指針的指針。

要釋放內存,您需要首先獲取該指針。

void matrix_free(int*** matrix, int s)
{
    int** m = *matrix;
    int i;
    for(i = 0; i < s; i++)
    {
        free( m[i] );
    }
    free( m );

    *matrix = NULL;
}

此變體還使您可以將參數設置為NULL:

matrix_free( &matrix , s );
assert( matrix == NULL );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM