Gestión de memoria dinámica
El almacenamiento dinámico sirve cuando tamaño o lifetime no se conocen al compilar.
¿Qué es Gestión de memoria dinámica?
El almacenamiento dinámico sirve cuando tamaño o lifetime no se conocen al compilar.
Reserva un array en runtime y libéralo correctamente.
Puntos importantes
- Todo puntero debe apuntar a un objeto vivo compatible o ser null.
- Libera exactamente una vez cada allocation propia.
- Expresa ownership y const con claridad.
Ejemplos de código C y C++
main.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
C++
main.cpp
#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++
C empareja malloc/calloc con free y comprueba fallos; std::vector posee y libera memoria automáticamente incluso con exceptions.
C
Ownership y limpieza son convenciones manuales.
C++
Los contenedores y RAII codifican ownership y limpieza en el lifetime.
Ejercicios prácticos
Ejecuta ambas versiones y modifícalas para observar sus garantías.
- Prueba null y fallos de allocation.
- Usa AddressSanitizer y UndefinedBehaviorSanitizer.
- Documenta el ownership de cada puntero.