Liberando Memória com free()
Parte da seção Logic & Flow do Journey de C da Coddy — lição 35 de 63.
Quando você aloca memória dinamicamente usando malloc(), essa memória permanece alocada até que você a libere explicitamente. A função free() é a sua ferramenta para retornar a memória alocada dinamicamente de volta ao sistema quando você terminar de usá-la.
A função free() recebe um argumento: um ponteiro para o bloco de memória que você deseja desalocar. Este deve ser o mesmo ponteiro que foi retornado por malloc() (ou funções relacionadas como calloc()).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Alocar memória
*ptr = 42; // Usar a memória
free(ptr); // Liberar a memória quando terminarDeixar de chamar free() cria o que é conhecido como um vazamento de memória. A memória alocada permanece reservada pelo seu programa, mesmo que você não a esteja mais usando. Em programas de longa execução ou programas que alocam memória repetidamente, esses vazamentos podem consumir toda a memória disponível do sistema e causar problemas de desempenho ou falhas.
Lembre-se: cada malloc() deve ter um free() correspondente. Este emparelhamento é essencial para um gerenciamento de memória responsável na programação C.
Desafio
FácilEscreva um programa em C que demonstre o ciclo de vida completo da alocação e desalocação dinâmica de memória. Seu programa deve:
- Ler um número inteiro
countdo usuário, representando quantos inteiros serão armazenados - Usar
malloc()comsizeof()para alocar dinamicamente memória para um array decountinteiros - Verificar se a alocação de memória foi bem-sucedida - se falhar, imprimir
Memory allocation failed!e encerrar o programa - Se a alocação for bem-sucedida, imprimir
Memory allocated successfully! - Ler
countvalores inteiros do usuário e armazená-los no array alocado - Calcular e imprimir a soma de todos os valores no formato:
Sum: [value] - Encontrar e imprimir o valor máximo no formato:
Maximum: [value] - Usar
free()para desalocar a memória - Imprimir
Memory freed successfully!para confirmar a limpeza
Lembre-se de incluir o cabeçalho <stdlib.h> para usar malloc() e free(). Este desafio demonstra o emparelhamento essencial de malloc() e free() para evitar vazamentos de memória em seus programas.
Por exemplo, se a entrada for:
4
15 8 23 12Sua saída deve ser:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Este desafio reforça o conceito crítico de que cada bloco de memória alocado dinamicamente deve ser devidamente liberado quando não for mais necessário, completando o ciclo responsável de gerenciamento de memória na programação C.
Folha de consulta
Use free() para desalocar memória que foi alocada com malloc():
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Alocar memória
*ptr = 42; // Usar a memória
free(ptr); // Liberar a memória quando terminarCada malloc() deve ter um free() correspondente para evitar vazamentos de memória. O ponteiro passado para free() deve ser o mesmo ponteiro retornado por malloc().
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Leia o número de inteiros para armazenar
scanf("%d", &count);
// TODO: Escreva seu código abaixo
// 1. Alocar memória usando malloc() com sizeof()
// 2. Verificar se a alocação foi bem-sucedida
// 3. Ler os valores inteiros e armazená-los
// 4. Calcular a soma e encontrar o máximo
// 5. Liberar a memória alocada
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato