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;
p = new persona;
delete p;
La biblioteca estándar de C
proporciona las funciones malloc, calloc, realloc y 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
0 comentarios: