Nas aulas anteriores vimos que basta usar a função free() para liberar a memória alocada dinamicamente. Porém, há uma pegadinha quando estamos falando de uma matriz dinâmica. Na aula de hoje vamos aprender como liberar a memória de uma matriz dinâmica com a função free().
Aprendemos nas aulas anteriores que uma matriz alocada dinamicamente é um vetor de vetores. Isso implica que sua alocação é feita em duas etapas. Primeiro alocamos um vetor cujo tamanho é a quantidade de linhas da matriz desejada. Em seguida, alocamos um novo vetor para cada posição do primeiro vetor, por isso um vetor de vetores.
Como a alocação de memória é feita em duas etapas, a liberação da memória também é feita em duas etapas.
Primeiro precisamos liberar cada linha da nossa matriz dinâmica para depois liberar o vetor que guardava os endereços das linhas, assim:
// liberando a memória alocada para a matriz
for(i = 0; i < 5; i++)
free(mat[i]); // libera cada uma das linhas
free(mat); // libera o vetor inicial com os ponteiros para as linhas
Código de exemplo completo em C para alocar e liberar memória de uma matriz
#include <stdio.h>
#include <stdlib.h>
/*
Aula 206: Como liberar a memória de uma matriz dinâmica?
Código escrito por Wagner Gaspar
Junho de 2021
*/
int main(){
int **mat, i, j;
// alocando um vetor de ponteiros (vetor de vetores)
mat = malloc(5 * sizeof(int*));
// alocando um vetor para cada posição do vetor anterior
for(i = 0; i < 5; i++)
mat[i] = malloc(5 * sizeof(int));
srand(time(NULL));
// gerando números e preenchendo a matriz
for(i = 0; i < 5; i++){
for(j = 0; j < 5; j++)
*(*(mat + i) + j) = rand() % 100;
}
// imprimindo a matriz no terminal
for(i = 0; i < 5; i++){
for(j = 0; j < 5; j++)
printf("%2d ", *(*(mat + i) + j));
printf("\n");
}
// liberando a memória alocada para a matriz
for(i = 0; i < 5; i++)
free(mat[i]); // libera cada uma das linhas
free(mat); // libera o vetor inicial com os ponteiros para as linhas
return 0;
}
