Memoria

Solo disponible en BuenasTareas
  • Páginas : 13 (3047 palabras )
  • Descarga(s) : 0
  • Publicado : 8 de octubre de 2010
Leer documento completo
Vista previa del texto
Manejo de Memoria en C
Daniel F. Moisset, 24-08-2007

1.

Obteniendo celdas de memoria
Daddy’s flown, across the ocean Leaving just a memory “Another brick in the Wall, part I” – Pink Floyd

Cuando se programa en C, siempre nos tenemos que encargar de que nuestras variables tengan celdas de memoria asignadas. Hay varias formas de hacer esto, seg´ n las necesidades que tengamos, y quedifieren en complejidad u de uso. A todas ya las han estado usando, pero vamos a tratar de describirlas mejor. Memoria global (a veces tambi´n llamada “est´tica”). Es la usada por e a variables globales. Cuando declaramos una variable global, al ejecutarse nuestro programa autom´ticamente tendr´ celdas asignadas para sus a a variables globales. Las cadenas costantes (por ejemplo "Hola, soy una cadena!")tambi´n se almacenan est´ticamente. Muchas veces, adem´s se almacenan e a a en un ´rea de memoria protegida contra escritura. a Memoria local Es la usada por variables declaradas dentro de funciones. Los argumentos de una funci´n tambi´n son variables locales. o e Cada vez que se invoca a una funci´n, C asigna celdas nuevas (es decir, o que nadie m´s esta usando en ese momento) para sus variableslocales a y para sus argumentos. Esto es por cada llamada. Si se invoca a una funci´n 10 veces seguidas, cada invocaci´n puede acabar con celdas diso o tintas. Si una funci´n se llama recursivamente, cada llamada recursiva o genera su propio juego de celdas independiente de las que est´n usando a las llamadas anteriores. Memoria din´mica Esta memoria se puede pedir en cualquier moa mento de laejecuci´n con una llamada a malloc. No es asignada a una o 1

variable en particular, sino que estamos obligados a usarla a trav´s de e punteros. Como puede verse, acceder a una variable (local a global) funciona de una forma en que tenemos garant´ de tener una celda de memoria asignada ıa (C resuelve el problema por nosotros). Cuando usamos variables a trav´s de e punteros eso no sucede, por locual necesitamos cuidado extra. Un ejemplo: int *una_funcion(void) { int x = 3; return &x; } void otra_funcion(void) { int *p = una_funcion(void); /* p apunta a una celda que ya no existe/esta en desuso! */ printf ("x = %d\n", *p); /* puede mostrar 3, o cualquier otro valor!*/ } Otro ejemplo: int *p; p[0] = 42; /* No hay celdas asignadas para *p ! */ O usando memoria din´mica: a int *p = malloc(sizeof(int)); int *q = NULL; q = p; free(p); q[0] = 42; /* No hay celdas asignadas para *q ! */

2

2.

Liberando celdas de memoria
La memoria pincha hasta sangrar, a los pueblos que la amarran y no la dejan andar libre como el viento. “La memoria” – Le´n Gieco o La tarea en s´ de liberar la memoria es f´cil: ı a La memoria global se libera autom´ticamente al terminar el programa. a Lamemoria local se libera autom´ticamente al terminar la invocaci´n a o a funci´n que la creo. o La memoria din´mica se puede liberar en cualquier momento de la a ejecuci´n pas´ndole un puntero al bloque de memoria a la funci´n free. o a o

La parte d´ ıficil de liberar la memoria, es decidir d´nde y cuando. El d´nde o o lo charlamos en la siguiente secci´n. Veamos el problema del cu´ndo. o a Si uno seapura mucho a liberar un bloque de memoria, es posible que otro pedazo de programa tenga todav´ un puntero a ese bloque, trate de ıa dereferenciar ese puntero, y ah´ es cuando empiezan a pasar cosas raras1 . En ı la secci´n anterior hubo un ejemplo de ese caso. Estos punteros que apuntan o a bloques ya liberados (o que nunca se asignaron a un bloque) se denominan dangling pointers. Si uno se demorademasiado en liberar un bloque de memoria, puede que se pierdan todos los punteros a ese bloque, y no queden oportunidades de liberarlo El bloque queda alojado y tenemos lo que se llama un memory leak. Por ejemplo int *p = malloc (sizeof(int)); ... /* Aca usamos el bloque */ p = malloc (sizeof(int)); /* Y ahora, como libero el primer bloque alojado? */ El momento justo para liberar un bloque...
tracking img