Memoria dinamica

14

Transcript of Memoria dinamica

Page 1: Memoria dinamica
Page 2: Memoria dinamica

Es memoria que se reserva en tiempo de ejecución. Su principalventaja frente a la estática, es que su tamaño puede variardurante la ejecución del programa.(En C, el programador esencargado de liberar esta memoria cuando no la utilice más). Eluso de memoria dinámica es necesario cuando no conocemos elnúmero de datos/elementos a tratar; sin embargo es algo máslento, ya que el tiempo ejecución depende del espacio que se vaha usar Hay que mencionar que la memoria estática es masrápida ya que esta disponible desde que se inicio el programa.

Page 3: Memoria dinamica

Su tamaño y forma es variable (o puede serlo) a lo largode un programa, por lo que se crean y destruyen entiempo de ejecución. Esto permite dimensionar laestructura de datos de una forma precisa: se vaasignando memoria en tiempo de ejecución según se vanecesitando.

Page 4: Memoria dinamica

► Los punteros proporcionan el soporte necesario para el potentesistema de asignación dinámica de memoria de C.

► La asignación dinámica es la forma en la que un programapuede obtener memoria mientras se está ejecutando.

► A las variables globales por ejemplo, se les asigna memoria entiempo de compilación.

► Durante la ejecución no se pueden añadir variables globales olocales, pero existen ocasiones en las que un programa necesitausar cantidades de memoria variables.

Page 5: Memoria dinamica
Page 6: Memoria dinamica

New devuelve una referencia a una posición en memoriaque a guardar el tipo indicado en la sentencia new.

Tras una llamada fructífera, new devuelve un puntero. Si nohay suficiente memoria libre para satisfacer la petición, seda un fallo de asignación y devuelve un NULL.

El siguiente código asigna memoria para guardar datos de una estructura persona:

persona *p; p = new persona;

Page 7: Memoria dinamica

La instrucción delete es la opuesta a new porque devuelve alsistema la memoria previamente asignada.

Una vez que la memoria ha sido liberada, puede ser reutilizadaen una posterior llamada a new.

Ejemplo:

persona *p; p = new persona;

……..

delete p;

Page 8: Memoria dinamica

La biblioteca estándar de C proporciona las funciones malloc,calloc, realloc y free para el manejo de memoriadinámica. Estas funciones están definidas en el archivo decabecera stdlib.h.

MALLOCReserva un bloque de memoria y devuelve un puntero void al iniciode la misma. Tiene la siguiente definición:void *malloc(size_t size);

donde el parámetro size especifica el número de bytes a reservar.En caso de que no se pueda realizar la asignación, devuelve el valornulo (definido en la macro NULL), lo que permite saber si huboerrores en la asignación de memoria.

Page 9: Memoria dinamica

CALLOCFunciona de modo similar a malloc, pero además de reservarmemoria, inicializa a 0 la memoria reservada. Se usa comúnmentepara arreglos y matrices. Está definida de esta forma:void *calloc(size_t nmemb, size_t size);

El parámetro nmemb indica el número de elementos a reservar,y size el tamaño de cada elemento. El ejemplo anterior se podríareescribir con calloc de esta forma:

Page 10: Memoria dinamica

REALLOCLa función realloc redimensiona el espacio asignado de formadinámica anteriormente a un puntero. Tiene la siguientedefinición:void *realloc(void *ptr, size_t size);

Donde ptr es el puntero a redimensionar, y size el nuevotamaño, en bytes, que tendrá. Si el puntero que se le pasa tieneel valor nulo, esta función actúa como malloc. Si la reasignaciónno se pudo hacer con éxito, devuelve un puntero nulo, dejandointacto el puntero que se pasa por parámetro. Al usar realloc, sedebería usar un puntero temporal. De lo contrario, podríamostener una fuga de memoria, si es que ocurriera un erroren realloc.

Page 11: Memoria dinamica

Cuando se redimension la memoria con realloc, si el nuevotamaño (parámetro size) es mayor que el anterior, seconservan todos los valores originales, quedando los bytesrestantes sin inicializar. Si el nuevo tamaño es menor, seconservan los valores de los primeros size bytes. Los restantestambién se dejan intactos, pero no son parte del bloqueregresado por la función.

Page 12: Memoria dinamica

FREELa función free sirve para liberar memoria que se asignódinámicamente. Si el puntero es nulo, free no hace nada. Tiene lasiguiente definición:void free(void *ptr);El parámetro ptr es el puntero a la memoria que se desea liberar:Una vez liberada la memoria, si se quiere volver a utilizar elpuntero, primero se debe reservar nueva memoriacon malloc o calloc:

Page 13: Memoria dinamica
Page 14: Memoria dinamica