无法发现双重免费

Can't spot double free

我尝试使用动态内存分配来初始化矩阵,为此我创建了一个辅助函数。 当我尝试释放内存时出现问题。我遇到 双重释放或损坏 错误。

我明白什么是双重释放错误,但无法在我的代码中发现它。

void
delete_matrix(matrix_t *mat)
{
    for(int i = 0; i < mat->rows; i++)
    {
        free(mat->data[i]); /* It crashes at first iteration */
        mat->data[i] = NULL;
    }
    free(mat->data);
    mat->data = NULL;
}


int
init_matrix(matrix_t *mat, int rows, int cols)
{
    mat->rows = rows;
    mat->cols = cols;

    mat->data = (int**)malloc(rows * sizeof(int));

    for(int i = 0; i < rows; i++)
    {
        mat->data[i] = (int*)malloc(cols * sizeof(int));
    }
    return 0;
}

gdbonline.com 上的完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

typedef struct
{
    int ** data;
    int rows;
    int cols;
}matrix_t;

int  init_matrix(matrix_t *mat, int rows, int cols);
void delete_matrix(matrix_t *mat);

int
main()
{
    printf("> Program started\n");

    matrix_t mat_A;
    init_matrix(&mat_A, 1000, 1000);
    delete_matrix(&mat_A);
    printf("> Program done\n");
    sleep(0);
    return 0;
}


int
init_matrix(matrix_t *mat, int rows, int cols)
{
    mat->rows = rows;
    mat->cols = cols;

    mat->data = (int**)malloc(rows * sizeof(int));
    if(!mat->data)
    {
        printf("! malloc error (init_matrix 1)\n");
        return -1;
    }

    for(int i = 0; i < rows; i++)
    {
        mat->data[i] = (int*)malloc(cols * sizeof(int));
        if(!mat->data[i])
        {
            printf("! malloc error (init_matrix 2)\n");
            return -1;
        }
    }
    return 0;
}


void
delete_matrix(matrix_t *mat)
{
    for(int i = 0; i < mat->rows; i++)
    {
        free(mat->data[i]);
        mat->data[i] = NULL;
    }
    free(mat->data);
    mat->data = NULL;
}

提前致谢。

I'm getting double free or corruption error.

由于不正确的分配可能导致损坏。

//                                         v-v---- wrong type. 
// mat->data = (int**)malloc(rows * sizeof(int));
mat->data = malloc(sizeof *(mat->data) * rows);
//                 ^-----------------^ The right size by construction
//                                     No need to code the matching type