Liberación de memoria con free()
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 35 de 63.
Cuando asignas memoria dinámicamente usando malloc(), esa memoria permanece asignada hasta que la liberas explícitamente. La función free() es tu herramienta para devolver la memoria asignada dinámicamente al sistema cuando hayas terminado de usarla.
La función free() toma un argumento: un puntero al bloque de memoria que deseas liberar. Este debe ser el mismo puntero que fue devuelto por malloc() (o funciones relacionadas como calloc()).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Asignar memoria
*ptr = 42; // Usar la memoria
free(ptr); // Liberar la memoria al terminarNo llamar a free() crea lo que se conoce como una fuga de memoria. La memoria asignada permanece reservada por su programa aunque ya no la esté utilizando. En programas de larga ejecución o programas que asignan memoria repetidamente, estas fugas pueden consumir toda la memoria disponible del sistema y causar problemas de rendimiento o bloqueos.
Recuerda: cada malloc() debe tener un free() correspondiente. Este emparejamiento es esencial para una gestión de memoria responsable en la programación en C.
Desafío
FácilEscribe un programa en C que demuestre el ciclo de vida completo de la asignación y liberación dinámica de memoria. Tu programa debe:
- Leer un entero
countdel usuario que represente cuántos enteros se van a almacenar - Usar
malloc()consizeof()para asignar dinámicamente memoria para un arreglo decountenteros - Verificar si la asignación de memoria fue exitosa; si falla, imprimir
Memory allocation failed!y terminar el programa - Si la asignación tiene éxito, imprimir
Memory allocated successfully! - Leer
countvalores enteros del usuario y almacenarlos en el arreglo asignado - Calcular e imprimir la suma de todos los valores en el formato:
Sum: [value] - Encontrar e imprimir el valor máximo en el formato:
Maximum: [value] - Usar
free()para liberar la memoria - Imprimir
Memory freed successfully!para confirmar la limpieza
Recuerda incluir el encabezado <stdlib.h> para usar malloc() y free(). Este desafío demuestra el emparejamiento esencial de malloc() y free() para prevenir fugas de memoria en tus programas.
Por ejemplo, si la entrada es:
4
15 8 23 12Tu salida debería ser:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Este desafío refuerza el concepto crítico de que cada bloque de memoria asignado dinámicamente debe ser liberado adecuadamente cuando ya no sea necesario, completando el ciclo responsable de gestión de memoria en la programación en C.
Hoja de referencia
Usa free() para liberar la memoria que fue asignada con malloc():
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Asignar memoria
*ptr = 42; // Usar la memoria
free(ptr); // Liberar la memoria cuando se haya terminadoCada malloc() debe tener un free() correspondiente para prevenir fugas de memoria. El puntero pasado a free() debe ser el mismo puntero devuelto por malloc().
Pruébalo tú mismo
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Leer el número de enteros a almacenar
scanf("%d", &count);
// TODO: Escribe tu código a continuación
// 1. Asignar memoria usando malloc() con sizeof()
// 2. Verificar si la asignación fue exitosa
// 3. Leer los valores enteros y almacenarlos
// 4. Calcular la suma y encontrar el máximo
// 5. Liberar la memoria asignada
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas6Gestión de memoria
Memoria Stack vs. HeapAsignación dinámica - malloc()Uso de sizeof() para la asignaciónComprobación de fallos de asignaciónLiberación de memoria con free()Asignación con calloc()Resumen: Arrays dinámicos