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; }