En C ++, el término "implementación de memoria dinámica" se refiere a la asignación manual de almacenamiento por un programador. Heap es donde se implementa la memoria compartida distribuida, mientras que la pila es donde las variables no estáticas y locales adquieren recursos de memoria.
Aplicaciones
¿Cómo se asigna C ++ y desasigna memoria??
Los métodos malloc () y calloc () en C ++ se utilizan para cambiar dinámicamente la memoria en la ejecución. Mientras que el método Free () se usa para liberar la memoria que se ha asignado. Estos métodos son proporcionados por C ++ junto con los dos operadores 'nuevos' y 'eliminar' que hacen que la asignación de memoria sea más fácil y más eficiente.
La correlación entre la 'nueva' palabra clave y 'nuevo' operador nuevo
Estas dos cosas son diferentes entre sí.
Se llevan a cabo dos eventos: distribución de memoria y formación de objetos. Ambos son manejados por la 'nueva' palabra clave. Llamar al operador y llamar al constructor en sí son los procedimientos para asignar almacenamiento. El operador 'nuevo' no asumirá ninguna responsabilidad por invocar el constructor, pero le permite ajustar la estrategia de asignación de almacenamiento. La nueva palabra clave tiene esa responsabilidad. Es factible llamar al constructor sin usar el operador nuevo.
Nuevo operador
La demanda de asignación de memoria en el almacenamiento abierto está indicada por el nuevo operador. Si se puede acceder a suficiente memoria, un nuevo operador procesa datos. Luego, lo inicializa y le da al objeto del puntero la dirección de la memoria recientemente asignada y configurada.
Ejemplo 1
Ejecutamos este código para mostrar cómo se pueden utilizar los operadores nuevos y eliminados; la memoria se asignará y liberará dinámicamente.
#incluir
usando el espacio de nombres STD;
int main ()
int* a = nulo;
a = nuevo (Nothrow) int;
si (!a)
cout << "Memory is not allocated\n";
demás
*a = 45;
cout << "Value of a: " << *a << endl;
flotante *c = nuevo flotante (67.84);
cout << "Value of c: " << *c << endl;
int x = 6;
int *b = new (Nothrow) int [x];
si (!b)
cout << "Memory is not allocated\n";
demás
para (int j = 0; j < x; j++)
b [j] = j+1;
cout << "A chunk of memory containing values: ";
para (int j = 0; j < x; j++)
cout << b[j] << " ";
eliminar a;
eliminar c;
eliminar [] b;
regresar 0;
Las bibliotecas requeridas se integrarían. A continuación, el espacio de nombres estándar se agregará como 'STD'. Aquí, la función Main () se invocaría. Inicializaríamos un puntero y configuraríamos este puntero en 'NULL'. Solicitemos el almacenamiento de las variables que se utilizan para un 'nuevo' operador. El tipo de datos de 'a' será 'entero'. Se aplicaría la condición 'si-else'. Si se cumple la condición definida, la instrucción 'Cout' mostrará el texto 'La memoria no está asignada'. De lo contrario, almacenaríamos el valor del puntero.
Luego, el comando 'cout' muestra el valor del puntero. Ahora, solicitaríamos un bloque de memoria utilizando el 'nuevo' operador. Especificamos el valor de punto flotante de la variable 'C' utilizando el operador 'nuevo'. Ahora, el 'Cout' imprimirá el valor de la variable 'C'. Aquí, especificamos el tamaño del bloque de memoria. Declaramos una variable 'x' y establecemos su tipo de datos como un 'entero'. Construimos un nuevo puntero llamado 'B' y le proporcionamos el valor utilizando el 'nuevo' operador.
Una vez más, se utilizará la condición 'if-else'. Dentro de la declaración 'Else' hemos utilizado la declaración 'para'. Inicialmente, se declararía la variable de bucle 'j' y definimos la condición. Luego, aumentamos el valor de la variable de bucle en 1. El comando 'cout' se usaría para imprimir la línea 'una parte de los valores que contienen memoria'. Una vez más, emplearemos el bucle 'para'.
Ahora, liberaremos la memoria asignada mediante la utilización del operador 'Eliminar'. Antes de agregar el comando 'return 0', liberamos el bloque de la memoria asignada usando la matriz.
Adquirimos este tipo de resultado después de ejecutar el programa mencionado anteriormente.
Ejemplo 2
En este caso, utilizaremos el 'nuevo' operador para diferentes objetos.
#incluir
#incluir
usando el espacio de nombres STD;
int main ()
int *l = nulo;
l = nuevo int ();
int *v = new int (23);
si(!l)
cout<<"bad memory allocation"<
demás
cout<<"memory allocated successfully"<*l = 20;
cout<<"*l = "<<*l<cout<<"*v = "<<*v<
doble *arr = null;
arr = new Double [20];
si(!arr)
Cout<<"memory not allocated"<demás
para (int k = 0; k<20;k++)
arr [k] = k+1;
cout<<"arr values : ";
para (int k = 0; k<20;k++)
cout<< arr[k]<<"\t";
eliminar l;
eliminar v;
eliminar [] arr;
regresar 0;
En la ilustración está la integración de las bibliotecas necesarias . A continuación, se agregará el espacio de nombres conocido como "STD". El método main () se llamaría. Para inicializar un puntero, lo configuraríamos en "NULL."El valor de la variable" i "que se usa para el operador" nuevo "se almacenaría aquí. El tipo de datos de esta variable es "entero."La condición" if-else "se utilizará. Si se cumple la condición especificada, la declaración de "asignación de memoria mala" se mostrará mediante la declaración "Cout". Si no, mantendríamos el valor del puntero.
Luego, el texto "Memoria asignada con éxito" se muestra utilizando el comando "Cout". El valor del puntero se establecería. El valor del puntero sería mostrado por el comando 'cout'. Inicializamos la matriz con el tipo de datos "doble" y le dimos el valor "nulo."Usando el 'nuevo' operador, definimos el valor de esta matriz. Utiliza una declaración "if-else". Cuando se cumple la condición, el comando "cout" imprime "la memoria no asignada."; más, hemos usado declaraciones anidadas "para".
Antes de definir la condición, la variable de bucle "j" se especificaría primero. A continuación, agregamos 1 al valor de 'J'. Los valores de la matriz se imprimirían utilizando el comando 'Cout'. Usaríamos el bucle "para" una vez más. Ahora, usaremos el operador Eliminar. Liberaremos la memoria que se asignó. Liberamos el bloque de la memoria asignada utilizando la matriz antes de agregar la instrucción "return 0".
Después de implementar el código mencionado anteriormente, obtenemos el resultado deseado.
Conclusión
El uso del 'nuevo' operador es el foco de este artículo. Para los tipos de datos definidos por el usuario en clases y otros tipos de datos, utilizaremos el 'nuevo' operador. Hemos ejecutado dos ejemplos relacionados con este tema. El primer ejemplo demuestra cómo usar el 'nuevo' operador de C ++. La última ilustración muestra cómo aplicar el "nuevo" operador a los objetos.