ASIGNACIÓN DINAMICA DE MEMORIA

ASIGNACIÓN DINAMICA DE MEMORIA

Para crear y mantener estructuras dinámicas de datos se requiere la asignación dinámica de memoria, la cual permite que un programa obtenga más memoria en tiempo de ejecución, para almacenar nuevos nodos. Cuando el programa ya no necesita la memoria, esta se puede liberar para que se pueda reutilizar al asignar otros objetos en el futuro. El límite para la asignación dinámica de memoria puede ser tan grande como la cantidad de memoria física disponible en la computadora, o la cantidad de memoria virtual disponible en un sistema con memoria virtual. Tambien se puede decir que la asignación de memoria dinámica significa que la reserva de memoria se realiza dinámicamente en tiempo de ejecución, no siendo necesario entonces tener que especificar en la declaración de variables la cantidad de memoria que se va a requerir. La reserva de memoria dinámica añade una gran flexibilidad a los programas porque permite al programador la posibilidad de reservar la cantidad de memoria exacta en el preciso instante en el que se necesite, sin tener que realizar una reserva por exceso en prevención a la que pueda llegar a necesitar. A menudo, los limites son mucho mas pequeños ya que la memoria disponible en la computadora debe compartirse entre muchos programas. La asignación dinámica de memoria de un objeto existe hasta que es liberada explícitamente por el programador, o por la salida de un bloque o por el recolector de basura. En este contexto, se dice que ese objeto tiene tiempo de vida dinámico. El operador newrecibe como argumento el tipo de objeto que se va a asignar en la forma dinámica y devuelve un apuntador a un objeto de este tipo. También la memoria reservada de forma dinámica suele estar alojada en el heap o almacenamiento libre, y la memoria estática en el stack o pila (con excepción de los objetos de duración estática, los cuales suelen colocarse en una zona estática de datos). La pila suele ser una zona muy limitada. El heap, en cambio, en principio podría estar limitado por la cantidad de memoria dinámica. Generalmente la memoria es asignada desde una gran pool o memoria sin usar, llamada heap. La ubicación exacta de la memoria asignada no es conocida, por lo tanto esa memoria es accedida indirectamente, generalmente vía referencia.

Los operadores new y delete son más versátiles que maloc() y free(). Existe otra característica importantes de los operadores new y delete y es que ellos nunca requieren moldeado (conversión forzosa de tipos) de tipos y eso hace que new y delete más fáciles de utilizar que malloc() y free().VENTAJAS DE USO EN C++ En C las funciones malloc() y free() asignan y liberan memoria de un bloque de memoria denominado el montículo del sistema. los operadores new y delete. Otra ventaja proviene del hecho de que new y delete se implementan como operadores y no como funciones. Los objetos del almacenamiento libre se eliminan con el operador delete. ya que el compilador realiza verificación de tipos cada vez que un programa asigna memoria con new. que asignan y liberan la memoria de una zona de memoria llamada almacén libre. Son más fiables. . ya que ellos pueden asociar la asignación de memoria con el medio que lo utiliza. Esto significa que new y delete se construyen en el propio lenguaje de modo que los programas pueden utilizar new y delete sin incluir ningún archivo de cabecera. Los objetos creados con new residen en el almacenamiento libre. Sabiendo esto sobre las funciones en C pasemos a C++ que ofrece un nuevo y mejor método para gestionar la asignación dinámica de memoria. La función malloc() asigna memoria utilizando asignación dinámica debido a que puede gestionar la memoria utilizando la ejecución de un programa.

. un array o cualquier otro tipo de dato. Esto permite usar el operador delete con punteros sin necesidad de preguntar si es nulo antes. El operador new devuelve un puntero. Operador delete: Cuando se ha terminado de utilizar un bloque de memoria previamente asignado por new. También es bueno preguntar si un puntero es nulo antes de intentar liberar la memoria dinámica que le fue asignada. aunque es aconsejable liberar siempre la memoria reservada con new usando delete.OPERADORES NEW Y DELETE Operador new: C++ proporciona otro método para obtener bloques de memoria: el operador new. una estructura. Cuando se usa el operador delete con un puntero nulo. un floar. Lo mismo se aplica a emplazamiento. pero no puede ser usada con arrays. se usará para asignar valores iniciales a la memoria reservada con new. Las formas tercera y cuarta se usan para reservar memoria para arrays dinámicos. La expresión será normalmente un puntero. el operador delete[] se usa para liberar memoria de arrays dinámicos. NULL. Existe el peligro de pérdida de memoria si se ignora esta regla. El puntero se utiliza para referenciar el bloque de memoria. Es importante liberar siempre usando delete la memoria reservada con new. no se realiza ninguna acción. De todos modos. El dato u objeto dato puede ser un int. El operador opcional :: está relacionado con la sobrecarga de operadores. mediante el operador delete. es buena idea asignar el valor 0 a los punteros que no han sido inicializados y a los que han sido liberados. La inicialización. se puede liberar el espacio de memoria y dejarlo disponible para otros usos. Se considera una práctica muy sospechosa no hacerlo. si aparece. El operador delete se usa para liberar la memoria dinámica reservada con new. La memoria reservada con new será válida hasta que se libere con delete o hasta el fin del programa. new devuelve un puntero nulo. Si la reserva de memoria no tuvo éxito. que es la dirección del bloque asiganado de memoria. El bloque de memoria suprimido se devuelve al espacio de almacenamiento libre. El operador new asigna un bloque de memoria que es el tamaño del tipo de dato. de modo que habrá más memoria disponible para asignar otros bloques de memoria.

ptr = new char[lon+1]. // libera memoria de ptr } Operador delete: //Muestra la asignación dinámica de una cadena de caracteres #include <iostream. cin. } . // cadesta ahora en ptr Deleteptr.get(). delete p. strcpy(p.h> #include <string.h> // uso de strcpy() Void main() { Char*cad = ´Sierras de Cazorla. Segura y Maginaµ. Char *ptr.h> Void main (void) { Char *p.h> #include <string.EJEMPLOS Operador new: # include <iostream. Intlon = strlen(cad). p = new char[80]. cout<<µ Pulse intro para continuarµ. ´Tu tioesta el loma lindaµ) cout<<p<<endl. cad). strcpy (ptr. // copia cad a nueva area de memoria // apuntada por ptr Cout<<endl<< ´ptr = ´ <<ptr.

// Array de 10 punteros a float: f = newfloat *[10].39. f[9][9] = 21. delete i. float **f.intmain() { char *c.32. // liberar memoria dinámica for(n = 0. n++) delete[] f[n]. // Cadena de 122 más el nulo: c = newchar[123]. int n. c[1] = 0. n < 10. (1) // Cada elemento del array es un array de 10 float for(n = 0. int *i = NULL. (2) // f es un array de 10*10 f[0][0] = 10. return 0. delete[] c. } . n++) f[n] = newfloat[10]. delete[] f. n < 10. c[0] = 'a'.

Sign up to vote on this title
UsefulNot useful