Punteros y memoria

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++

C
Ejecutar →
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;
}
Resultado esperado
last=16
C++
Ejecutar →
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';
}
Resultado esperado
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.