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 memoriaLa 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.
Desafío
FácilCrea 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:
- Usar
newpara asignar dinámicamente memoria para un entero y almacenar el puntero en una variable llamadadynamicPtr - Asignar el primer valor de entrada a la memoria asignada dinámicamente utilizando el operador de desreferencia
- Imprimir el valor inicial almacenado en la memoria asignada dinámicamente
- Actualizar el valor en la memoria asignada dinámicamente al segundo valor de entrada
- Imprimir el valor actualizado
- Usar
deletepara liberar la memoria asignada dinámicamente - Establecer el puntero a
nullptrdespués de la eliminación - 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 successfullyHoja 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 memoriaPara 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;
}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
1Punteros y memoria
¿Qué es un puntero?Operador de direcciónOperador de desreferenciaPunteros nulosPunteros y arraysMemoria dinámica con 'new'Liberar memoria con 'delete'Resumen: Práctica de punteros2Vectores (Arrays dinámicos)
Introducción a std::vectorCreación de un VectorAgregar elementosAcceder a los elementosTamaño del VectorIterar con un bucle ForBucle For basado en rangosEliminar elementosResumen - Operaciones con Vectores5Proyecto: Herramienta de inventario
Configuración del proyectoAgregar y actualizar artículos3Proyecto: Herramienta de lista de tareas
Descripción general del proyectoAñadir una tarea