Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Un dato importante es que como tal este tipo de datos se crean y se destruyen mientras
se ejecuta el programa y por lo tanto la estructura de datos se va dimensionando de
forma precisa a los requerimientos del programa, evitndonos as perder datos o
desperdiciar memoria si hubiramos tratado de definir la cantidad de memoria a utilizar
en el momento de compilar el programa.
MEMORIA DINMICA
La memoria dinmica es un espacio de almacenamiento que se solicita en tiempo
de ejecucin. De esa manera, a medida que el proceso va necesitando espacio para
ms lneas, va solicitando ms memoria al sistema operativo para guardarlas. El
medio para manejar la memoria que otorga el sistema operativo, es el puntero,
puesto que no podemos saber en tiempo de compilacin dnde nos dar huecos el
sistema operativo (en la memoria de nuestro PC).
Un dato importante es que como tal este tipo de datos se crean y se destruyen
mientras se ejecuta el programa y por lo tanto la estructura de datos se va
dimensionando de forma precisa a los requerimientos del programa, evitndonos as
perder datos o desperdiciar memoria si hubiramos tratado de definirla cantidad de
memoria a utilizar en el momento de compilar el programa.
Cuando se crea un programa en el que es necesario manejar memoria dinmica el
sistema operativo divide el programa en cuatro partes que son: texto, datos
(estticos), pila y una zona libre o heap. En el momento de la ejecucin habr tanto
partes libres como partes asignadas al proceso por lo cual si no se liberan las partes
utilizadas de la memoria y que han quedado inservibles es posible que se agote
esta parte y por lo tanto la fuente de la memoria dinmica. Tambin la pila cambia su
tamao dinmicamente, pero esto no depende del programador sino del sistema
operativo.
VENTAJAS:
Es posible disponer de un espacio de memoria arbitrario que dependa de
informacin dinmica (disponible slo en ejecucin): Toda esa memoria que maneja
es implementada por el programador cuando fuese necesario.
Otra ventaja de la memoria dinmica es que se puede ir incrementando durante la
ejecucin del programa. Esto permite, por ejemplo, trabajar con arreglos dinmicos.
Es memoria que se reserva en tiempo de ejecucin. Su tamao puede variar durante
la ejecucin del programa y puede ser liberado mediante la funcin free.
DESVENTAJAS:
Es difcil de implementar en el desarrollo de un programa o aplicacin.
Es difcil implementar estructuras de datos complejas como son los tipos recursivos
(rboles, grafos, etc.).Por ello necesitamos una forma para solicitar y liberar
memoria para nuevas variables que puedan ser necesarias durante la ejecucin de
nuestros programas: Heap.
Una desventaja de la memoria dinmica es que es ms difcil de manejar.
La memoria dinmica puede afectar el rendimiento. Puesto que con la memoria
esttica el tamao de las variables se conoce en tiempo de compilacin, esta
informacin est incluida en el cdigo objeto generado. Cuando se reserva memoria
de manera dinmica,
Se tienen que llevar a cabo varias tareas, como buscar un bloque de memoria libre y
almacenar la posicin y tamao de la memoria asignada, de manera que pueda ser
liberada ms adelante. Todo esto representa una carga adicional, aunque esto
depende de la implementacin y hay tcnicas para reducir su impacto.
Programacin en C/Manejo
dinmico de memoria
< Programacin en C
En esta seccin haremos uso bastante (inevitablemente) de los punteros, por lo que te
recomendamos que tengas muy bien establecidos estos conocimientos.
Memoria dinmica[editar]
Memoria esttica[editar]
Es el espacio en memoria que se crea al declarar variables de cualquier tipo de dato
(primitivas [int,char...] o derivados [struct,matrices,punteros...]). La memoria que estas
variables ocupan no puede cambiarse durante la ejecucin y tampoco puede ser
liberada manualmente.
La memoria dinmica puede afectar el rendimiento. Puesto que con la memoria esttica
el tamao de las variables se conoce en tiempo de compilacin, esta informacin est
incluida en el cdigo objeto generado, por lo cual el proceso es muy eficiente. Cuando
se reserva memoria de manera dinmica, se tienen que llevar a cabo varias tareas,
como buscar un bloque de memoria libre y almacenar la posicin y tamao de la
memoria asignada, de manera que pueda ser liberada ms adelante. Todo esto
representa una carga adicional, aunque esto depende de la implementacin y hay
tcnicas para reducir su impacto.
Todos los objetos tienen un tiempo de vida, es decir, el tiempo durante el cual se
garantiza que el objeto exista. En C, existen 3 tipos de duracin: esttica, automtica y
asignada. Las variables globales y las variables locales declaradas con el
especificador static tienen duracin esttica. Se crean antes de que el programa
inicie su ejecucin y se destruyen cuando el programa termina. Las variables locales
no static tienen duracin automtica. Se crean al entrar al bloque en el que fueron
declaradas y se destruyen al salir de ese bloque. Duracin asignada se refiere a los
objetos cuya memoria se reserva de forma dinmica. Como se explic anteriormente,
esta memoria se crea y se debe liberar de forma explcita. Los arreglos de longitud
variable de C99 son un caso especial. Tienen duracin automtica, con la particularidad
de que son creados a partir de su declaracin.
malloc[editar]
La funcin malloc reserva un bloque de memoria y devuelve un puntero void al inicio
de la misma. Tiene la siguiente definicin:
Ej:
int *puntero;
char *puntcarc;
puntero=(int *)malloc(4);
puntcarc=(char *)malloc(200);
int *i;
i = malloc(sizeof(int));
int *vect1, n;
printf("Nmero de elementos del vector: ");
scanf("%d", &n);
calloc[editar]
La funcin calloc funciona de modo similar a malloc , pero adems de reservar
memoria, inicializa a 0 la memoria reservada. Se usa comnmente para arreglos y
matrices. Est definida de esta forma:
realloc[editar]
La funcin realloc redimensiona el espacio asignado de forma dinmica anteriormente a
un puntero. Tiene la siguiente definicin:
/* Reservamos 5 bytes */
void *ptr = malloc(5);
if (tmp_ptr == NULL) {
/* Error: tomar medidas necesarias */
}
else {
/* Reasignacin exitosa. Asignar memoria a ptr */
ptr = tmp_ptr;
}
free o cfree[editar]
La funcin free sirve para liberar memoria que se asign dinmicamente. Si el puntero
es nulo, free no hace nada. Adems existe la funcin cfree, que sirve para liberar
memoria de los elementos que han sido reservados con calloc(). Tienen la siguiente
definicin:
int *i;
i = malloc(sizeof(int));
free(i);
Una vez liberada la memoria, si se quiere volver a utilizar el puntero, primero se debe
reservar nueva memoria con malloc o calloc :
int *i = malloc(sizeof(int));
free(i);
Buenas prcticas[editar]
Como se vio en las secciones anteriores, siempre que se reserve memoria de forma
dinmica con malloc , realloc o calloc , se debe verificar que no haya habido
errores (verificando que el puntero no sea NULL ). Cuando se trata de verificar el valor
de un puntero (y slo en ese caso), se puede usar de forma indistinta 0 NULL . Usar
uno u otro es cuestin de estilo. Como ya se vio, las funciones de asignacin dinmica
de memoria devuelven un puntero void . Las reglas de C establecen que un
puntero void se puede convertir automticamente a un puntero de cualquier otro tipo,
por lo que no es necesario hacer una conversin (cast), como en el siguiente ejemplo:
Una posible razn para usar la conversin explcita es si se escribe cdigo en C que se
vaya a compilar junto con cdigo C++, ya que en C++ s es necesario realizar esa
conversin.
Tratar de utilizar un puntero cuyo bloque de memoria ha sido liberado con free puede
ser sumamente peligroso. El comportamiento del programa queda indefinido: puede
terminar de forma inesperada, sobrescribir otros datos y provocar problemas de
seguridad. Liberar un puntero que ya ha sido liberado tambin es fuente de errores.
Para evitar estos problemas, se recomienda que despus de liberar un puntero siempre
se establezca su valor a NULL .
int *i;
i = malloc(sizeof(int));
free(i);
i = NULL;
-