Reserva de memoria en glibc
09 04 2008
Glibc proporciona varias funciones para reservar memoria bajo el control explícito del programa. Cada una de estas funciones varían en cuanto a eficiencia:
Comentarios :
No hay comentarios »
- La familia de funciones malloc permite una reserva de memoria completamente genérica.
- Obstack es otra familia de funciones menos genérica pero más eficiente para reservar memoria tipo pila.
- Y la función alloca te permite reservar espacio de almacenamiento dinámicamente que será liberada automáticamente.
Las funciones tipo malloc son las más empleadas debido a su versatilidad (aunque haya que pagar un coste en eficiencia). Está es la firma de la función malloc
void *malloc(size_t number_of_bytes);
Su empleo es muy sencillo, si quieres reservar digamos 300 bytes debes pasarle ese número como parámetro y la función, en caso de éxito, te devolverá un puntero al comienzo de esa zona de 300 bytes reservada para ti. En caso de error devuelve un puntero a NULL (generalmente debido a una falta de memoria). El puntero a void, el tipo del valor de retorno, simplemente nos permite, mediante un cast (implicito), emplear cualquier tipo de datos para su almacenamiento. El tipo size_t es simplemente un unsigned int definido en varios archivos de cabecera stdio.h, stddef.h, stdlib.h, and string.h:
typedef unsigned int size_t;
por ejemplo
char *micadena;
micadena = malloc(200);
Intentará hacer que el puntero micadena apunte al comienzo de una zona reservada para ti de 200 bytes o retornando un puntero a null en caso de fallo.
El operador sizeof (atención no es una función aunque lo parezca) se utiliza muy a menudo en conjunción con malloc ya que este nos devuelve el número de bytes que ocupa un determinado tipo de datos que se le pasa como argumento, así:
sizeof(int);
sizeof(char);
sizeof(miEstructura);
Nos devolverá el tamaño que ocupa en bytes un entero un caracter o una estructura definida por nosotros respectivamente. Siguiendo nuestro ejemplo para reservar espacio para una cadena de 200 caracteres la forma más correcta tras todo esto sería:
char *micadena;
micadena = malloc(sizeof(char)*200);
if(!micadena)
{
printf("Error fatal. No hay suficiente memoria\n);
}
sizeof puede ser usado para encontrar el tamaño de cualquier tipo de datos, variables o estructuras. Simplemente debes proporcionale uno de estos como argumento. Pongo otro ejemplo de esto:
int i;
struct COORD {float x,y,z};
typedef struct COORD PT;
i = sizeof(int);
i = sizeof(i);
i = sizeof(struct COORD);
i = sizeof(PT);
Todas las lineas anteriores son válidas.
Una función que si debería estar siempre acompañando a malloc es la función free. Se encarga de liberar la memoria que previamente hemos reservado, su firma es la siguiente:
void free(void *ptr);
y el puntero que le debemos pasar como argumento es obviamente el que nos devolvió la función malloc. Un error relativamente común cuando empleamos malloc es no utilizar free para liberar la memoria cuando ya no la necesitamos. Esta es la causa principal de los llamados "memory leaks" o "porque mi programa consume desenfrenadamente más y más memoria".
Una nota sobre malloc: malloc NUNCA inicializa el bloque de memoria que acaba de reservar. Si crees por ejemplo que ese bloque debe contener byes a cero estas equivocado, puede contener cualquiera valores (basura).
Para no hacer este post más extenso comentaré en otro proximamente las funciones realloc y calloc cuyo propósito es idéntico aunque tienen nuevas características (que también los hacen más caros computancionalmente hablando)
Para saber más:
Librería C de GNU
Categorías : Programación
Referencias : 3 Referencias »



Tracked: Apr 14, 22:44
Tracked: Apr 20, 17:20
Tracked: Apr 26, 19:58