Gestión de memoria C ++: nuevo y eliminado

En este tutorial, aprenderemos a administrar la memoria de manera efectiva en C ++ usando operaciones nuevas y de eliminación con la ayuda de ejemplos.

C ++ nos permite asignar la memoria de una variable o una matriz en tiempo de ejecución. Esto se conoce como asignación de memoria dinámica.

En otros lenguajes de programación como Java y Python, el compilador gestiona automáticamente las memorias asignadas a las variables. Pero este no es el caso en C ++.

En C ++, necesitamos desasignar manualmente la memoria asignada dinámicamente después de que no tengamos uso para la variable.

Podemos asignar y luego desasignar memoria dinámicamente usando los operadores newy deleterespectivamente.

Nuevo operador de C ++

El newoperador asigna memoria a una variable. Por ejemplo,

 // declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;

Aquí, hemos asignado memoria dinámicamente para una intvariable usando el newoperador.

Observe que hemos utilizado el puntero pointVar para asignar la memoria de forma dinámica. Esto se debe a que el newoperador devuelve la dirección de la ubicación de la memoria.

En el caso de una matriz, el newoperador devuelve la dirección del primer elemento de la matriz.

En el ejemplo anterior, podemos ver que la sintaxis para usar el newoperador es

 pointerVariable = new dataType;

eliminar operador

Una vez que ya no necesitemos usar una variable que hemos declarado dinámicamente, podemos desasignar la memoria ocupada por la variable.

Para ello, deletese utiliza el operador. Devuelve la memoria al sistema operativo. Esto se conoce como desasignación de memoria .

La sintaxis de este operador es

 delete pointerVariable;

Considere el código:

 // declare an int pointer int* pointVar; // dynamically allocate memory // for an int variable pointVar = new int; // assign value to the variable memory *pointVar = 45; // print the value stored in memory cout << *pointVar; // Output: 45 // deallocate the memory delete pointVar;

Aquí, hemos asignado memoria dinámicamente para una intvariable usando el puntero pointVar.

Después de imprimir el contenido de pointVar, desasignamos la memoria usando delete.

Nota : Si el programa utiliza una gran cantidad de memoria no deseada new, el sistema puede bloquearse porque no habrá memoria disponible para el sistema operativo. En este caso, el deleteoperador puede ayudar a que el sistema se bloquee.

Ejemplo 1: asignación de memoria dinámica de C ++

 #include using namespace std; int main() ( // declare an int pointer int* pointInt; // declare a float pointer float* pointFloat; // dynamically allocate memory pointInt = new int; pointFloat = new float; // assigning value to the memory *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; // deallocate the memory delete pointInt, pointFloat; return 0; )

Salida

 45 45,45

En este programa, asignamos memoria dinámicamente a dos variables de inty floattipos. Después de asignarles valores e imprimirlos, finalmente desasignamos las memorias usando el código

 delete pointInt, pointFloat;

Nota: la asignación de memoria dinámica puede hacer que la administración de la memoria sea más eficiente.

Especialmente para matrices, donde muchas veces no sabemos el tamaño de la matriz hasta el tiempo de ejecución.

Ejemplo 2: Operador nuevo y de eliminación de C ++ para matrices

 // C++ Program to store GPA of n number of students and display it // where n is the number of students entered by the user #include #include using namespace std; int main() ( int num; cout <> num; float* ptr; // memory allocation of num number of floats ptr = new float(num); cout << "Enter GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 <> *(ptr + i); ) cout << "Displaying GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 << " :" << *(ptr + i) << endl; ) // ptr memory is released delete () ptr; return 0; )

Salida

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

En este programa, le hemos pedido al usuario que ingrese el número de estudiantes y lo almacene en la variable num.

Luego, hemos asignado la memoria dinámicamente para la floatmatriz usando new.

Ingresamos datos en la matriz (y luego los imprimimos) usando la notación de puntero.

Una vez que ya no necesitamos la matriz, desasignamos la memoria de la matriz utilizando el código delete () ptr;.

Observe el uso de ()after delete. Usamos los corchetes ()para indicar que la desasignación de memoria es la de una matriz.

Ejemplo 3: Operador nuevo y de eliminación de C ++ para objetos

 #include using namespace std; class Student ( int age; public: // constructor initializes age to 12 Student() : age(12) () void getAge() ( cout << "Age = " << age 

Output

 Age = 12

In this program, we have created a Student class that has a private variable age.

We have initialized age to 12 in the default constructor Student() and print its value with the function getAge().

In main(), we have created a Student object using the new operator and use the pointer ptr to point to its address.

The moment the object is created, the Student() constructor initializes age to 12.

We then call the getAge() function using the code:

 ptr->getAge();

Notice the arrow operator ->. This operator is used to access class members using pointers.

Articulos interesantes...