Asignación de memoria dinámica en C ++

Asignación de memoria dinámica en C ++

La asignación de memoria se determina en el momento de la declaración variable. Pero en la mayoría de los casos, no sabemos cuánta memoria se requiere para una variable específica. En ese caso, la asignación de memoria debe hacerse en el tiempo de ejecución. La asignación de memoria de tiempo de ejecución del programa se conoce como asignación de memoria dinámica. En la asignación de memoria dinámica, no conocemos el tamaño real de la variable. Asignamos manualmente la memoria para esa variable, y también puede ser una matriz u objeto de una clase. Los punteros juegan un papel clave en la asignación de memoria dinámica. Cuando asignamos dinámicamente la memoria, el "nuevo"La palabra clave se usa para decirle al compilador que estamos asignando dinámicamente la memoria. Cuando hayamos terminado con la asignación de la memoria, al final, necesitamos manualmente "borrar"Esa memoria dinámica reservada. En otros lenguajes de programación como Python y Java, no tenemos que asignar dinámicamente la memoria porque el compilador lo hace automáticamente. Pero en C y C ++, hacemos esto manualmente usando el nuevo (para reservar espacio) y borrar (al espacio libre) Palabras clave.

¿Por qué asignamos dinámicamente la memoria??

En C ++, la asignación de memoria dinámica se realiza cuando no conocemos el tamaño real de la variable o los elementos que queremos almacenar en una variable. Los valores totales que deben almacenarse se deciden en el tiempo de ejecución. Heap asigna la memoria dinámica, pero en el caso de la estática, la memoria se asigna en una pila. Entonces, cuando no conocemos el tamaño exacto de las variables y debe hacerse en tiempo de ejecución, asigne la memoria dinámicamente.

Sintaxis:

Memoria de reserva
Pointer_variable = new data_type;

Primero, tenemos que reservar la memoria en un montón. Para ese propósito, definimos una variable de tipo de puntero igual a la "nuevo"Palabra clave y luego definir el tipo de variable. El "nuevo"La palabra clave se reserva la memoria en el montón.

También podemos definir una variable de tipo matriz.

Pointer_variable = new data_type [size];

Para inicializar la variable, simplemente ponemos el valor en el paréntesis después del data_type () como este:

Pointer_variable = new data_type (valor);
Memoria libre
eliminar pointer_variable;

Cuando hayamos terminado con la asignación de memoria dinámica, desintegra la memoria para guardar los datos de la fuga de memoria. El "borrar"La palabra clave con el nombre de la variable de puntero libera la memoria dinámica.

Asignación de memoria dinámica de variable

Explicemos el proceso de asignación y desastitencia de la memoria dinámica de una variable de tipo entero.

Código:

#incluir
usando el espacio de nombres STD;
int main ()
int* p_value = null;
p_value = nuevo int;
*p_value = 674;
cout<< "Value of p_valueis : " << *p_value<eliminar p_value;
regresar 0;

Inicie este código incluyendo el archivo de encabezado para acceder a los métodos de entrada y salida de la biblioteca. Esta biblioteca tiene métodos incorporados a los que podemos acceder en nuestro programa. Ahora, llame al método main () y defina una variable de puntero "*p_value" para contener la dirección del montón ya que la asignación de memoria dinámica se realiza en el montón. La asignación estática se realiza en la pila porque ya sabemos que la cantidad de datos significa el tamaño de la variable. Inicialice el puntero entero con "NULL".

A continuación, asigne la memoria dinámica de la variable "p_value" del puntero con la palabra clave "nueva" y el tipo de datos "int" de la variable. Al usar el término "nuevo", se instruye al compilador que asigne la memoria de montón para la variable de tipo entero. Además, almacene un valor de "674" en la variable "*p_value" de tipo puntero ". Luego, ejecute el comando "Cout" para imprimir la línea "Valor de P_Value" y el valor de la variable entera "*P_Value" que se almacena dinámicamente en el montón. Para recuperar los datos que se guardan en el montón, usamos el puntero. El puntero almacena y accede a los datos en el montón; no accede directamente a los datos. Luego, use el comando "Eliminar" para eliminar la variable de tipo de puntero "P_Value" para que no perdamos nuestros datos o ninguna otra persona pueda acceder a nuestros datos.

Producción:

El valor de p_value es: 674

Asignación de memoria dinámica de un objeto de clase

Definamos una clase y asignemos dinámicamente la memoria a sus objetos en esta ilustración.

Código:

#incluir
usando el espacio de nombres STD;
Clase Program_0
público:
Programa_0 ()
cout<< "I am Constructor" <
~ Program_0 ()
cout<< "I am Destructor" <
;
int main ()
Programa_0* myArray = nuevo Program_0 [3];
eliminar [] myArray;
regresar 0;

En este código, integre la biblioteca para usar el método "cout". Luego, use el espacio de nombres estándar. Definir una clase "Program_0" y establecer esta clase como pública. Se puede acceder a los métodos de clase pública fuera de la clase. Las otras clases también pueden acceder a los métodos de esta clase. Defina el constructor y el destructor dentro de esta clase. Inicializamos los miembros de los datos de la clase en el constructor. El destructor destruye los objetos una vez que se ejecuta el programa. Libera la memoria después de que se realiza la tarea. Ambos están definidos por el nombre de la clase.

En el constructor program_0 (), escribimos una línea de código para imprimir un mensaje en el terminal. Del mismo modo, en el destructor ~ Program_0 (), muestre un mensaje ejecutando la instrucción "Cout". Siempre que se cree el objeto de clase, se llaman a los constructores y destructores. Cuando llamamos a la clase en particular, ejecuta el constructor y luego realiza otras operaciones que le asignamos. Después de terminar el proceso, se llama al destructor y destruye todos los objetos creados para acceder a los métodos de clase y los miembros de los datos.

Además, ejecute la función principal () de este código. Cada clase se llama y sus objetos se crean dentro de este método. Cree un objeto "*myArray" de puntero de la clase "Program_0" y asigne la memoria dinámica utilizando la palabra clave "nueva". Aquí, definimos el tamaño de la matriz 3. La clase se llama tres veces, y el constructor también se ejecuta tres veces. Después de todo esto, el destructor se llama tres veces para liberar el espacio. El destructor elimina el objeto que llama a la clase tres veces.

Producción:

Soy constructor
Soy constructor
Soy constructor
Soy destructor
Soy destructor
Soy destructor

Conclusión

Este documento analiza la asignación de memoria dinámica en C++. También observamos por qué asignamos dinámicamente la memoria. La asignación de memoria dinámica es importante cuando no conocemos el tamaño real de los datos que se almacenarán. En otros idiomas como Python, los programadores no necesitan asignar manualmente la memoria porque el compilador lo hace automáticamente. Después de asignar la memoria, almacenar los datos allí y proporcionar acceso a ella, la memoria se desacalta. La desasignación es importante porque si no desanimamos la memoria, existe la posibilidad de fugas de memoria. La asignación de memoria dinámica de una variable entera y un objeto de clase se explica en los códigos de esta guía.