释放C中指针指针的动态内存

时间:2018-04-14 10:38:00

标签: c dynamic free

尝试释放动态数组的内存时出错。

void Ex()
{
 int **Matrix = dyn_matrix_allocation(rows, cols);
.
.
.
    free_My_Dyn_Mem(Matrix, rows);
}

void free_My_Dyn_Mem(int **to_Release, int size)
{
    int i;
    for (i = 0; i < size; i++)
        free(to_Release[i]);
//free(to_Release); - If I do this, the program crash.
}

void **dyn_matrix_allocation(int rows, int cols)
{
    void **matrix = (void**)calloc (sizeof(int*), cols);
    assert(matrix); /*calloc worked*/
    int i;
    for (i = 0; i < rows; i++)
    {
        matrix[i] = (int*)calloc(sizeof(int), rows);
        assert(matrix[i]); /*calloc worked*/
    }
    return matrix;
}
释放数组本身后,我正试图释放指针(**matrix)的指针,然后我收到一个错误。调试器显示没什么特别的。任何想法为什么?

1 个答案:

答案 0 :(得分:1)

由于2D寻址的定义不明确,您在分配动态矩阵时遇到了一些错误。

分配中的第一个错误,在这里你选择创建你的矩阵列依赖分配一个cols指针数组ti int

void **matrix = (void**)calloc (sizeof(int*), cols);

现在你应该为每列分配一个rows整数数组,但是你分配了rows个整数数组:

for (i = 0; i < rows; i++)  //Should be for (i = 0; i < cols; i++)
{
    matrix[i] = (int*)calloc(sizeof(int), rows);
    assert(matrix[i]); /*calloc worked*/
}

到目前为止,一些编译器,或者lint甚至是好的调试器都应该告诉你你在外面的界限。

但是当您使用错误的寻址释放内存时会触发异常。

void Ex()
{
 int **Matrix = dyn_matrix_allocation(rows, cols);
.
.
.
    free_My_Dyn_Mem(Matrix, rows);  //But you allocated cols pointers...
}

您应该传递大小为cols成员的整数指针数组,而不是rows

现在你发布你分配的界限:

for (i = 0; i < size; i++)
    free(to_Release[i]);

调试器应该抱怨很多!

然后释放一个现已损坏的内存......

free(to_Release);

您的代码应为:

#include <stdlib.h>
#include <assert.h>

void free_My_Dyn_Mem(int **to_Release, int size)
{
    int i;
    for (i = 0; i < size; i++)
        free(to_Release[i]);
    free(to_Release);   //- If I do this, the program crash.
}

int **dyn_matrix_allocation(int rows, int cols)
{
    int **matrix = calloc(sizeof(int *), cols);
    assert(matrix); /*calloc worked */
    int i;
    //for (i = 0; i < rows; i++)
    for (i = 0; i < cols; i++)
    {
        matrix[i] = calloc(sizeof(int), rows);
        assert(matrix[i]);  /*calloc worked */
    }
    return matrix;
}

void Ex(void)
{
    int rows = 100;
    int cols = 20;
    int **Matrix = dyn_matrix_allocation(rows, cols);
//.
//.
//.
    //free_My_Dyn_Mem(Matrix, rows);
    free_My_Dyn_Mem(Matrix, cols);
}

请记住,您选择了列有序矩阵。

P.S。我忘了添加断言通常用于开发检查,可以删除它们来定义符号NDEBUG。当您需要永久控制时,例如分配返回时的错误,您应该使用标准if (condition) ErrorHandling(...);