Reserva de memoria en glibc

09 04 2008 Programación
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:

  • 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

Bookmark Reserva de memoria en glibc  at del.icio.us Digg Reserva de memoria en glibc Mixx Reserva de memoria en glibc Bloglines Reserva de memoria en glibc Technorati Reserva de memoria en glibc Fark this: Reserva de memoria en glibc Bookmark Reserva de memoria en glibc  at YahooMyWeb Bookmark Reserva de memoria en glibc  at Furl.net Bookmark Reserva de memoria en glibc  at reddit.com Bookmark Reserva de memoria en glibc  at blinklist.com Bookmark Reserva de memoria en glibc  at Spurl.net Bookmark Reserva de memoria en glibc  at NewsVine Bookmark Reserva de memoria en glibc  at Simpy.com Bookmark Reserva de memoria en glibc  at blogmarks Bookmark Reserva de memoria en glibc  with wists Bookmark Reserva de memoria en glibc  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Referencias


14 04 2008
Realloc y calloc
Como ya habiamos comentado en un anterior post sobre la asignación de memoria dinámica además de malloc que asigna un zona de memoria para nuestra programa tanto realloc como calloc hacen exactamente lo mismo pero además tienen capacidades adicionales (qu
Weblog: Novanebula blog
Tracked: Apr 14, 22:44
20 04 2008
Obstack
Obstack es otros de los medios que emplea la librería C de GNU para la asignación dinámica de memoria. Obstack es una pila de objetos (datos) que puede crecer dinámicamente. Es posible crear cualquier número de obstacks para, en cada uno, ir almacenando d
Weblog: Novanebula blog
Tracked: Apr 20, 17:20
26 04 2008
Alloca
La función alloca reserva espacio en la pila de la función que lo llama, devolviendo un puntero ha este espacio reservado. Este espacio temporal es automáticamente liberado cuando la función que llama a alloca retorna. Esta es la firma o prototipo de l
Weblog: Novanebula blog
Tracked: Apr 26, 19:58

Comentarios

Mostrar comentarios como (Plano | Hilos)
No hay comentarios

Añadir comentario


Encerrando entre asteriscos convierte el texto en negrita (*palabra*), el subrayado es hecho así: _palabra_.
Smilies normales como :-) y ;-) son convertidos en imágenes.