¿Cómo trabajar con la asignación de memoria dinámica C ++?



Este artículo explora la asignación de memoria dinámica en C ++, una característica importante que le permite considerar sus necesidades de memoria para recursos en tiempo real.

La asignación de memoria dinámica en C ++ es una característica muy importante que le permite considerar sus requisitos para hacer frente a la necesidad de recursos en tiempo real. En este artículo estaríamos explorando Exploración en detalle. Los siguientes consejos se cubrirán en este artículo,

Así que comencemos con este artículo sobre asignación de memoria dinámica en C ++





¿Necesita una asignación de memoria dinámica?

Digamos que queremos ingresar una oración como una matriz de caracteres, pero no estamos seguros del número exacto de caracteres requeridos en la matriz.

Ahora, al declarar la matriz de caracteres, si especificamos su tamaño más pequeño que el tamaño de la cadena deseada, obtendremos un error porque el espacio en la memoria asignada a la matriz es menor en comparación con el tamaño de la cadena de entrada. Si especificamos su tamaño más grande que el tamaño de la cadena de entrada, entonces a la matriz se le asignará un espacio en la memoria que es mucho más grande que el tamaño de la cadena deseada, consumiendo así innecesariamente más memoria incluso cuando no es necesaria.



En el caso anterior, no tenemos la idea sobre el tamaño exacto de la matriz hasta el tiempo de compilación (cuando la computadora compila el código y el usuario ingresa la cadena). En tales casos, utilizamos el nuevo operador.

C ++ define dos operadores unarios nuevo y Eliminar que realizan la tarea de asignar y desasignar memoria durante el tiempo de ejecución. Dado que estos operadores (nuevos y eliminados) operan con memoria de almacenamiento libre (memoria Heap), también se denominan operador de almacenamiento libre. Los punteros brindan el soporte necesario para el sistema de asignación de memoria dinámica en C ++.

Con la ayuda de la asignación dinámica, un programa puede obtener memoria durante el tiempo de ejecución.



Las variables globales y locales se asignan a la memoria durante el tiempo de compilación. Sin embargo, no podemos agregar ninguna variable global o local durante el tiempo de ejecución. Si el programa necesita usar una cantidad variable de memoria, necesitaríamos asignar memoria durante el tiempo de ejecución, como y cuando sea necesario. Y, por supuesto, aquí las rutinas de asignación dinámica pueden servir para este propósito.

pivotar y desvincular en sql

Diferencias entre la asignación de memoria estática y la asignación de memoria dinámica:

Esta es una arquitectura de memoria básica utilizada para cualquier programa C ++:

Memoria - Asignación de memoria dinámica - Edureka

Necesitaremos una imagen como esta

La pila se utiliza para la asignación de memoria estática y el montón para la asignación de memoria dinámica, ambos se almacenan en la RAM de la computadora.

Variables que se asignan en la pila mientras que la asignación de memoria estática se almacena directamente en la memoria y el acceso a esta memoria es muy rápido, también se trata su asignación cuando se compila el programa. Cuando una función o un método llama a otra función que a su vez podría llamar a otra función y así sucesivamente, la ejecución de todas estas funciones permanece suspendida hasta que la última función devuelve su valor. La pila siempre se almacena en un orden LIFO (último en entrar, primero en salir), el bloque reservado más recientemente es siempre el siguiente bloque que se liberará. Esto ayuda a realizar un seguimiento de la pila, liberar un bloque de la pila no es más que ajustar un puntero.

Las variables asignadas en el montón tienen su memoria asignada en tiempo de ejecución mientras que la asignación de memoria dinámica. El acceso a esta memoria es un poco más lento en comparación con la pila, pero el tamaño del montón solo está limitado por el tamaño de la memoria virtual. El elemento del montón no tiene dependencias entre sí y siempre se puede acceder al azar en cualquier momento. Podemos asignar un bloque en cualquier momento y liberarlo en cualquier momento. Esto dificulta el seguimiento de qué partes del montón se asignan o desasignan en un momento dado.

Continuando con este artículo sobre asignación de memoria dinámica en C ++

Asignación de memoria usando nuevo Palabra clave

En C ++ el nuevo El operador se utiliza para asignar memoria en tiempo de ejecución y la memoria se asigna en bytes. los nuevo operador denota una solicitud de asignación de memoria dinámica en el montón. Si hay suficiente memoria disponible, nuevo El operador inicializa la memoria y devuelve la dirección de la memoria recién asignada e inicializada a la variable de puntero.

Sintaxis:

tipo de datos * pointer_name = nuevo tipo de datos

Ejemplo:

int * ptr = new int // Podemos declarar una variable durante la asignación dinámica de las siguientes dos formas. int * ptr = new int (10) int * ptr = new int {15} // nuevo operador también se usa para asignar un bloque (una matriz) de memoria de tipo data-type. int * ptr = new int [20] // La declaración anterior asigna memoria dinámicamente para 20 enteros continuamente de tipo int y devuelve un puntero al primer elemento de la secuencia al puntero 'ptr'.

Nota : Si el montón no tiene suficiente memoria para asignar, la nueva solicitud indica falla al lanzar una excepción std :: bad_alloc, a menos que se use 'nothrow' con el nuevo operador, en cuyo caso devuelve un puntero NULL. Por lo tanto, es una buena práctica verificar la variable de puntero producida por new antes de usarla en el programa.

Continuando con este artículo sobre asignación de memoria dinámica en C ++

Desasignación de memoria usando Eliminar Palabra clave:

Una vez que la memoria del montón se asigna a una variable o un objeto de clase utilizando el nuevo palabra clave, podemos desasignar ese espacio de memoria usando la Eliminar palabra clave.

Sintaxis:

delete pointer_variable // Aquí, pointer_variable es el puntero que apunta al objeto de datos creado por new. delete [] pointer_variable // Para liberar la memoria de matriz asignada dinámicamente señalada por pointer-variable usamos la siguiente forma de eliminación:

Ejemplo:

eliminar ptr eliminar [] ptr

Nota : La extensión del objeto o la vida útil del objeto es el tiempo durante el cual el objeto permanece en la memoria durante la ejecución del programa. La asignación de memoria del montón es más lenta que una pila, ya que, en el montón, no hay un orden particular en el que pueda asignar memoria, mientras que en la pila sigue LIFO.

Continuando con este artículo sobre asignación de memoria dinámica en C ++

Asignación dinámica de matrices

El uso principal del concepto de asignación de memoria dinámica es para asignar memoria a una matriz cuando tenemos que declararla especificando su tamaño pero no estamos seguros de ello.

Veamos, un ejemplo para entender su uso.

#incluir usando el espacio de nombres std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Asignación de memoria dinámica cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (marcas + i)} para (int i = 0 i

Explicación:
En este ejemplo, primero le pedimos al usuario el número de estudiantes en una clase y almacenamos su valor en la variable len. Luego declaramos una matriz de enteros y le asignamos espacio en la memoria dinámicamente igual al valor almacenado en la variable len usando esta declaración int * marks = new int [length] por lo que se le asigna un espacio igual a 'length * (size of 1 entero)'. El resto del código se explica por sí mismo.

Continuando con este artículo sobre asignación de memoria dinámica en C ++

Asignación de memoria dinámica para objetos

También podemos asignar objetos de forma dinámica.

Como sabemos, Constructor es una función miembro de clase especial que se usa para inicializar un objeto y Destructor también es una función miembro de clase que se llama siempre que el objeto sale del alcance.

Destructor se puede utilizar para liberar la memoria asignada al objeto. Se llama en las siguientes condiciones.

  • Cuando un objeto local sale del alcance
  • Para un objeto global, cuando se aplica un operador a un puntero al objeto de la clase

Podemos usar de nuevo punteros mientras asignamos memoria dinámicamente a los objetos.

Veamos un ejemplo de una matriz de objetos.

#incluir usando el espacio de nombres std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Salida:

Explicación:

El Constructor se llamará tres veces ya que estamos asignando memoria a tres objetos de la clase Random. El Destructor también se llamará tres veces durante cada uno de estos objetos. 'Random * a = new Random [3]' esta declaración es responsable de la asignación de memoria dinámica de nuestro objeto.

Por lo tanto, hemos llegado al final de este artículo sobre 'Asignación de memoria dinámica C ++'. Si desea obtener más información, consulte el por Edureka, una empresa de aprendizaje en línea de confianza. El curso de certificación y capacitación Java J2EE y SOA de Edureka está diseñado para capacitarlo en conceptos básicos y avanzados de Java junto con varios marcos de Java como Hibernate y Spring.

Tienes una pregunta para nosotros? Menciónelo en la sección de comentarios de este blog y nos pondremos en contacto con usted lo antes posible.

cómo crear un paquete en java