P. 1
ASIGNACIÓN DINAMICA DE MEMORIA

ASIGNACIÓN DINAMICA DE MEMORIA

|Views: 153|Likes:
Publicado porMirna Martinez

More info:

Published by: Mirna Martinez on Mar 16, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

03/16/2011

pdf

text

original

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.

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. Los operadores new y delete son más versátiles que maloc() y free(). Son más fiables. Otra ventaja proviene del hecho de que new y delete se implementan como operadores y no como funciones. 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(). ya que el compilador realiza verificación de tipos cada vez que un programa asigna memoria con new. Los objetos del almacenamiento libre se eliminan con el operador delete.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. . que asignan y liberan la memoria de una zona de memoria llamada almacén libre. Los objetos creados con new residen en el almacenamiento libre. 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. ya que ellos pueden asociar la asignación de memoria con el medio que lo utiliza. 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. los operadores new y delete.

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

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

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

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->