La asignación dinámica de memoria es una característica poderosa de C++ que permite a los programadores gestionar la memoria de manera eficiente durante la ejecución del programa. A diferencia de la memoria estática, que se asigna en tiempo de compilación, la memoria dinámica se asigna en tiempo de ejecución, lo que proporciona una mayor flexibilidad.

Conceptos Clave

  1. Memoria Estática vs. Dinámica:

    • Memoria Estática: Se asigna en tiempo de compilación y tiene un tamaño fijo.
    • Memoria Dinámica: Se asigna en tiempo de ejecución y puede cambiar de tamaño según las necesidades del programa.
  2. Operadores new y delete:

    • new: Asigna memoria en el heap y devuelve un puntero a la memoria asignada.
    • delete: Libera la memoria asignada por new.
  3. Operadores new[] y delete[]:

    • new[]: Asigna memoria para un array de elementos.
    • delete[]: Libera la memoria asignada para un array.

Ejemplos Prácticos

Asignación y Liberación de Memoria para un Solo Elemento

#include <iostream>

int main() {
    // Asignación dinámica de un solo entero
    int* p = new int;
    *p = 42; // Asignar valor

    std::cout << "Valor de p: " << *p << std::endl;

    // Liberar memoria
    delete p;

    return 0;
}

Explicación:

  • int* p = new int; asigna memoria para un entero y devuelve un puntero a esa memoria.
  • *p = 42; asigna el valor 42 a la memoria apuntada por p.
  • delete p; libera la memoria asignada.

Asignación y Liberación de Memoria para un Array

#include <iostream>

int main() {
    // Asignación dinámica de un array de enteros
    int* arr = new int[5];

    // Asignar valores
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 10;
    }

    // Imprimir valores
    for (int i = 0; i < 5; ++i) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }

    // Liberar memoria
    delete[] arr;

    return 0;
}

Explicación:

  • int* arr = new int[5]; asigna memoria para un array de 5 enteros.
  • El primer bucle for asigna valores a cada elemento del array.
  • El segundo bucle for imprime los valores del array.
  • delete[] arr; libera la memoria asignada para el array.

Ejercicios Prácticos

Ejercicio 1: Asignación Dinámica de un Entero

Instrucciones:

  1. Asigna dinámicamente memoria para un entero.
  2. Asigna un valor a esa memoria.
  3. Imprime el valor.
  4. Libera la memoria.

Solución:

#include <iostream>

int main() {
    int* num = new int;
    *num = 100;

    std::cout << "Valor de num: " << *num << std::endl;

    delete num;

    return 0;
}

Ejercicio 2: Asignación Dinámica de un Array

Instrucciones:

  1. Asigna dinámicamente memoria para un array de 10 enteros.
  2. Asigna valores a cada elemento del array.
  3. Imprime los valores del array.
  4. Libera la memoria.

Solución:

#include <iostream>

int main() {
    int* arr = new int[10];

    for (int i = 0; i < 10; ++i) {
        arr[i] = i * 2;
    }

    for (int i = 0; i < 10; ++i) {
        std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
    }

    delete[] arr;

    return 0;
}

Errores Comunes y Consejos

  1. No liberar memoria: No liberar la memoria asignada dinámicamente puede causar fugas de memoria.

    • Consejo: Siempre usa delete o delete[] para liberar la memoria cuando ya no la necesites.
  2. Usar delete en lugar de delete[] para arrays: Esto puede causar un comportamiento indefinido.

    • Consejo: Usa delete[] para liberar memoria asignada con new[].
  3. Acceder a memoria liberada: Intentar acceder a memoria después de haberla liberado puede causar errores.

    • Consejo: Asegúrate de no usar punteros después de liberar la memoria.

Conclusión

La asignación dinámica de memoria es una herramienta esencial en C++ que permite una gestión flexible y eficiente de la memoria. Comprender cómo usar new y delete correctamente es crucial para evitar errores comunes y asegurar que tu programa funcione de manera eficiente. En el próximo módulo, exploraremos la Programación Orientada a Objetos, que es fundamental para escribir código modular y reutilizable en C++.

© Copyright 2024. Todos los derechos reservados