Vazamento de memória em C

Pessoal implementei uma rede neural utilizando funções matriciais, porém está ocorrendo vazamento de memporia e a execução dela para e o codeblocks trava. Não sei o que fazer, impelementei as funções matriciais utilizando alocação dinâmica, porém não sei como eu devo esvaziar a memória quando necessário. Alguém pode em ajudar. Eis ai um exemplo de uma implementação de multiplicação de matriez. Onde eu deveria usar a função free()?

typedef struct
{
    int rows;
    int cols;
    double** point;

} Matrix;

Matrix* dot_point_matrix(Matrix* matrix_a, Matrix* matrix_b)
{
    double** malloc_matrix(int line, int col);
    int i, j;

    double **matrix = malloc_matrix(matrix_a->rows, matrix_b->cols);

    if((matrix_a->rows == matrix_b->rows) && (matrix_a->cols == matrix_b->cols))
    {
        for(i = 0; i < matrix_a->rows; i++)
        {
            for(j = 0; j < matrix_b->cols; j++)
            {
                matrix[i][j] = matrix_a->point[i][j] * matrix_b->point[i][j];
            }
        }
    }
    else
    {
        printf("As matrizes nao possuem numero de linhas e de colunas iguais\n");
    }

    Matrix *returned = (Matrix*)malloc(sizeof(Matrix));
    returned->rows = matrix_a->rows;
    returned->cols = matrix_b->cols;
    returned->point = matrix;
    return returned;
}

double** malloc_matrix(int line, int col)
{
    double **matrix = (double**)malloc(line * sizeof(double));
    int i;

    for(i = 0; i < line; i++)
    {
        matrix[i] = malloc(col * sizeof(double));
    }
    return matrix;
}

O problema pode estar nessa linha…

double **matrix = (double**)malloc(line * sizeof(double));

Não seria isso?

double **matrix = (double**)malloc(line * sizeof(double*));

Alguns exemplos…

Quanto ao free, creio que você precisa criar uma função que remova primeiro as colunas, depois as linhas e por ultimo a matriz

void free_matrix(Matrix* m) {
    int i, j;
    for(i = 0; i < m->rows; i++) {
        for (j = 0; j < m->cols; j++) {
            free(m->point[i][j]);
        }
        free(m->point[i]);
    }
    free(m);
}
1 curtida