Menu
Coddy logo textTech

Liberar memoria con 'delete'

Parte de la sección Lógica y Flujo del Journey de C++ de Coddy — lección 7 de 56.

Cuando asignas memoria dinámicamente usando new, esa memoria no desaparece automáticamente cuando terminas de usarla. A diferencia de las variables regulares que se limpian automáticamente, la memoria asignada dinámicamente permanece en uso hasta que la liberas explícitamente. Aquí es donde la palabra clave delete se vuelve esencial.

La palabra clave delete libera la memoria que fue asignada previamente con new. Cuando usas delete, le estás indicando al sistema que has terminado con esa memoria y que puede ser reutilizada para otros fines:

int* ptr = new int(42);  // Asignar memoria
// Usar la memoria...
delete ptr;              // Liberar la memoria

La regla fundamental de la gestión de memoria dinámica es sencilla: por cada new, debe haber un delete correspondiente. Si olvidas liberar la memoria asignada dinámicamente, creas una fuga de memoria: tu programa continúa reteniendo memoria que ya no está utilizando, lo que eventualmente puede causar que tu sistema se quede sin memoria disponible.

Después de llamar a delete en un puntero, ese puntero se vuelve inválido y no debe usarse de nuevo. Es una buena práctica establecer el puntero a nullptr después de eliminarlo para evitar usarlo accidentalmente.

challenge icon

Desafío

Fácil

Crea un programa que demuestre el ciclo de vida completo de la memoria dinámica asignando memoria con new, usándola y luego liberándola adecuadamente con delete.

Se proporcionarán las siguientes entradas:

  • Un valor entero para almacenar en la memoria asignada dinámicamente
  • Un segundo valor entero para actualizar el valor almacenado

Tu programa debe:

  1. Usar new para asignar dinámicamente memoria para un entero y almacenar el puntero en una variable llamada dynamicPtr
  2. Asignar el primer valor de entrada a la memoria asignada dinámicamente utilizando el operador de desreferencia
  3. Imprimir el valor inicial almacenado en la memoria asignada dinámicamente
  4. Actualizar el valor en la memoria asignada dinámicamente al segundo valor de entrada
  5. Imprimir el valor actualizado
  6. Usar delete para liberar la memoria asignada dinámicamente
  7. Establecer el puntero a nullptr después de la eliminación
  8. Imprimir un mensaje de confirmación de que la memoria ha sido liberada

Usa el siguiente formato de salida exacto:

Initial value: [first value]
Updated value: [second value]
Memory freed successfully

Hoja de referencia

La palabra clave delete libera la memoria que fue previamente asignada con new:

int* ptr = new int(42);  // Asignar memoria
// Usar la memoria...
delete ptr;              // Liberar la memoria

Para cada new, debe haber un delete correspondiente para evitar fugas de memoria.

Después de llamar a delete, establezca el puntero a nullptr para evitar el uso accidental de memoria no válida:

delete ptr;
ptr = nullptr;

Pruébalo tú mismo

#include <iostream>
using namespace std;

int main() {
    // Leer los valores de entrada
    int firstValue, secondValue;
    cin >> firstValue;
    cin >> secondValue;
    
    // TODO: Escribe tu código a continuación
    // 1. Asignar memoria usando new y almacenarla en dynamicPtr
    // 2. Asignar firstValue a la memoria reservada
    // 3. Imprimir el valor inicial
    // 4. Actualizar con secondValue
    // 5. Imprimir el valor actualizado
    // 6. Eliminar la memoria y establecer el puntero a nullptr
    // 7. Imprimir mensaje de confirmación
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo