Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Dominando la gestión de memoria en C++: uso experto de new y delete

Dominando la gestión de memoria en C++: uso experto de new y delete

Esta guía explica cómo asignar y liberar memoria en el montículo (heap) en C++ con new y delete, ilustrado a través de ejemplos claros y reales.

C++ da a los desarrolladores el poder de asignar memoria en tiempo de ejecución, conocido como asignación dinámica de memoria. A diferencia de lenguajes gestionados como Java o Python, C++ no recupera automáticamente la memoria del montículo; el programador debe liberarla explícitamente.

Usar los operadores new y delete proporciona el mecanismo básico para esta tarea. Estos operadores son la piedra angular de la gestión manual de memoria en C++ y están definidos en la biblioteca estándar de C++.


El operador new

El operador new asigna un bloque de memoria en el montículo y devuelve un puntero a su primer byte. Por ejemplo:

// declarar un puntero a int
int* puntoVar;
// asignar memoria dinámicamente usando new
puntoVar = new int;
// asignar un valor a la memoria asignada
*puntoVar = 45;

En este fragmento, puntoVar recibe la dirección de un int recién asignado. Como new devuelve un puntero, la variable debe ser de tipo puntero. Para arrays, new devuelve un puntero al primer elemento:

int* arr = new int[10]; // arr apunta al primer elemento de un array de 10 ints

La sintaxis general es:

variablePuntero = new tipoDato; // objeto único
variablePuntero = new tipoDato[tamaño]; // array

El operador delete

Cuando un objeto o array asignado con new ya no es necesario, se debe llamar a delete para liberar la memoria de vuelta al sistema operativo. No hacerlo resulta en fugas de memoria que pueden degradar el rendimiento o bloquear la aplicación.

Para un objeto único:

delete variablePuntero;

Para un array asignado con new[], use la forma de array:

delete[] variablePuntero;

Ejemplo de un ciclo de vida completo:

// asignar un int
int* puntoVar = new int;
*puntoVar = 45;
cout << *puntoVar; // Salida: 45
// desasignar
delete puntoVar;
Consejo: Empareje cada new con un delete correspondiente (o delete[] para arrays). Use RAII o punteros inteligentes (ej. std::unique_ptr) para automatizar este proceso en código de producción.

Ejemplo 1: Asignación dinámica básica

#include <iostream>
using namespace std;

int main() {
    int* puntoInt;
    float* puntoFloat;
    puntoInt = new int;
    puntoFloat = new float;
    *puntoInt = 45;
    *puntoFloat = 45.45f;
    cout << *puntoInt << endl;
    cout << *puntoFloat << endl;
    delete puntoInt;
    delete puntoFloat;
    return 0;
}

Salida

45
45.45

Este programa demuestra la asignación de dos tipos primitivos, asignación, salida y desasignación limpia.

Nota: La asignación dinámica puede mejorar la flexibilidad, especialmente cuando el tamaño se determina en tiempo de ejecución.

Ejemplo 2: Asignación de un array de floats

#include <iostream>
using namespace std;

int main() {
    int num;
    cout << "Ingrese número total de estudiantes: ";
    cin >> num;
    float* ptr = new float[num];
    cout << "Ingrese GPA de los estudiantes." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "Estudiante" << i + 1 << ": ";
        cin >> *(ptr + i);
    }
    cout << "\nMostrando GPA de los estudiantes." << endl;
    for (int i = 0; i < num; ++i) {
        cout << "Estudiante" << i + 1 << " :" << *(ptr + i) << endl;
    }
    delete[] ptr;
    return 0;
}

Salida

Ingrese número total de estudiantes: 4
Ingrese GPA de los estudiantes.
Estudiante1: 3.6
Estudiante2: 3.1
Estudiante3: 3.9
Estudiante4: 2.9
Mostrando GPA de los estudiantes.
Estudiante1 :3.6
Estudiante2 :3.1
Estudiante3 :3.9
Estudiante4 :2.9

El programa solicita al usuario el número de estudiantes, asigna un array de floats en consecuencia, recopila la entrada, muestra los datos y finalmente libera la memoria con delete[].


Ejemplo 3: Asignación dinámica de un objeto

#include <iostream>
using namespace std;

class Estudiante {
    int edad;
public:
    Estudiante() : edad(12) {}
    void obtenerEdad() {
        cout << "Edad = " << edad << endl;
    }
};

int main() {
    Estudiante* ptr = new Estudiante();
    ptr->obtenerEdad();
    delete ptr;
    return 0;
}

Salida

Edad = 12

Este ejemplo crea un objeto Estudiante en el montículo. El constructor inicializa edad a 12, y el método obtenerEdad lo imprime. Después de usarlo, delete libera la memoria del objeto.

Mejores prácticas modernas

Lenguaje C

  1. GE Digital Lanza Software de Gestión Predictiva de Activos, Cambiando el Mantenimiento de Reactivo a Proactivo
  2. Raspberry Pi 3 B+ – Características Actualizadas, Especificaciones y Guía de Compra
  3. Wittmann Battenfeld presenta la nueva serie X y el robot Primus 14
  4. Fundamentos de Memoria Digital: Direccionamiento, Acceso y Volatilidad
  5. Estructuras vs Clases en C++: Guía práctica para desarrolladores embebidos
  6. Dominando Variables, Literales y Constantes en C++: Guía Completa
  7. Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
  8. Herencia en C++: public, protected y private explicados
  9. Funciones y clases amigas en C++: dominando el control de acceso
  10. Gestión Dinámica de Memoria en C: calloc, malloc y free Explicados
  11. Dominando Operaciones de Directorios y Archivos en Python