Gestión de memoria dinámica en C y C++
En esta lección vas a reservar un arreglo cuyo tamaño solo se conoce al ejecutar el programa y a liberar esa memoria de forma segura.
Introducción
La memoria dinámica se usa cuando el tamaño o la duración de los datos no se puede fijar al compilar, por ejemplo cuando el número de elementos depende de lo que escribe el usuario. Esta memoria se reserva mientras el programa se ejecuta y hay que liberarla cuando ya no se necesita.
Puntos importantes
- Un puntero solo debe apuntar a un objeto que todavía existe, del tipo correcto, o valer null.
- Cada zona de memoria reservada debe liberarse exactamente una vez.
- Deja claro qué función es dueña de la memoria (ownership) y qué datos solo se leen (const).
Ejemplos de código C y C++
#include <stdio.h>
#include <stdlib.h>
int main(void) {
size_t count = 5;
int *values = calloc(count, sizeof *values);
if (!values) return 1;
for (size_t i = 0; i < count; ++i) values[i] = (int)(i * i);
printf("last=%d\n", values[count - 1]);
free(values);
return 0;
}
last=16
#include <iostream>
#include <vector>
int main() {
std::vector<int> values(5);
for (std::size_t i = 0; i < values.size(); ++i) values[i] = static_cast<int>(i * i);
std::cout << "last=" << values.back() << '\n';
}
last=16
Comparación entre C y C++
En C, calloc reserva memoria para 5 enteros y los inicializa a 0. El programa debe comprobar si la reserva ha fallado y llamar a free para liberar la memoria al final; si no, hay una fuga de memoria (memory leak). En C++, std::vector gestiona su propia memoria y la libera automáticamente cuando deja de usarse, incluso si ocurre una excepción.
La propiedad y la liberación de la memoria dependen por completo del programador.
Los contenedores y RAII liberan automáticamente los recursos cuando el objeto llega al final de su vida.
Ejercicios de práctica
Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.
- Prueba con punteros nulos y con fallos al reservar memoria.
- Ejecuta el programa con AddressSanitizer y UndefinedBehaviorSanitizer para detectar errores de memoria.
- Deja claro qué puntero es dueño de la memoria y cuál solo sirve para leer.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
Todos los retos