MEMORIAS DINÁMICAS



Memoria dinámica aquella  que se reserva en tiempo de ejecución. Su principal ventaja frente a la estática, es que su tamaño puede variar durante la ejecución del programa.(En C, el programador es encargado de liberar esta memoria cuando no la utilice más). El uso de memoria dinámica es necesario cuando no conocemos el número de datos/elementos a tratar; sin embargo es algo más lento, ya que el tiempo ejecución depende del espacio que se va ha usar Hay que mencionar que la memoria estática es mas rápida ya que esta disponible desde que se inicio el programa.

Datos Dinámicos: 
Asignación de Memoria dinámica
►Los punteros proporcionan el soporte necesario para el potente sistema de asignación dinámica de memoria de C.
►La asignación dinámica es la forma en la que un programa puede obtener memoria mientras se está ejecutando.
►A las variables globales por ejemplo, se les asigna memoria en tiempo de compilación.
►Durante la ejecución no se pueden añadir variables globales o locales, pero existen ocasiones en las que un programa necesita usar cantidades de memoria variables.
TIPOS DE MEMORIAS:
NEW - Asigna memoria

New devuelve una referencia a una posición en memoria que  guarda el tipo indicado en la sentencia new;Devuelve un puntero. Si no hay suficiente memoria libre para satisfacer la petición, se da 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;

DELETE – Libera memoria

Su tamaño y forma es variable (o puede serlo) a lo largo de un programa, por lo que se crean y destruyen en tiempo de ejecución. Esto permite dimensionar la estructura de datos de una forma precisa: se va asignando memoria en tiempo de ejecución según se va necesitando.



üLa instrucción delete es la opuesta a new porque devuelve al sistema la memoria previamente asignada.
üUna vez que la memoria ha sido liberada, puede ser reutilizada en una posterior llamada a new.
Ejemplo:
persona *p;
p = new persona;
  delete p;

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

MALLOC
Reserva un bloque de memoria y devuelve un puntero vacio al inicio de 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 valor nulo (definido en la macro NULL), lo que permite saber si hubo errores en la asignación de memoria.



CALLOC
Funciona de modo similar a malloc, pero además de reservar memoria, inicializa a 0 la memoria reservada. Se usa comúnmente para 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ía reescribir con calloc de esta forma:


REALLOC
La función realloc redimensiona el espacio asignado de forma dinámica anteriormente a un puntero. Tiene la siguiente definición:
void *realloc(void *ptr, size_t size);
Donde ptr es el puntero a redimensionar, y size el nuevo tamaño, en bytes, que tendrá. Si el puntero que se le pasa tiene el valor nulo, esta función actúa como malloc. Si la reasignación no se pudo hacer con éxito, devuelve un puntero nulo, dejando intacto el puntero que se pasa por parámetro. Al usar realloc, se debería usar un puntero temporal. De lo contrario, podríamos tener una fuga de memoria, si es que ocurriera un error en realloc.



FREE
La función free sirve para liberar memoria que se asignó dinámicamente. Si el puntero es nulo, free no hace nada. Tiene la siguiente 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 el puntero, primero se debe reservar nueva memoria con malloc o calloc:



EJEMPLO





About the author

Andres
Deja tu comentario :

0 comentarios:

Copyright © 2013 Lenguaje c and Blogger Themes.