[C con Clase] Malloc y mallinfo

Antonio Gómez jagse en intercomgi.com
Lun Ene 3 16:36:25 CET 2011


Hola Gilberto:

Muchas gracias por la ayuda. Ahora si funciona.
Tendré en cuenta lo de quitar las funciones propias para facilitar
vuestra ayuda.


Antonio 

-----Mensaje original-----
De: Gilberto Cuba Ricardo [mailto:gilberto.cuba en ucp.ho.rimed.cu] 
Enviado el: domingo, 02 de enero de 2011 21:17
Para: Lista de correo sobre C y C++
Asunto: Re: [C con Clase] Malloc y mallinfo

> Hola a todos:

Hola Antonio,

> Al escribir un programa en una asignación de malloc me devolvió un
> puntero nulo, es decir que no tenía memoria.
> No creo que el problema sea de uso masivo de variables ni de tamaño de las
mismas.
> Para averiguar donde tenía el problema intenté usar la estructura
> mallinfo pero los resultados que me dá no son
> correctos. Es decir, no se como se usa mallinfo correctamente.

Para detectar la fuga de memoria en un programa de forma rápida
existen diversos programas por ahí; no conozco ninguno, pero sí he
escuchado que se utilizan; sin embargo, pienso que con un buen
debuguer, un poco de tiempo y conocimiento sobre el código, se puede
encontrar la fuga de memoria.

Respecto a mallinfo, yo tampoco lo he utilizado nunca, porque no me
parece que sea del standard de C, y sino que me corrijan otros; pero
yo desde mi MinGW32 4.5.0 no pude probar tu código porque no está
definido en ningún include, o por lo menos yo no lo encontré. Tuve que
probarlo en Debian con Gcc 4.3.

> Para probar como se usaba escribí un pequeño programa en C que
> asignaba con malloc cada elemento de una
> matriz de punteros un espacio de 100Megas (SI CIEN MEGAS) y después de
cada asignación, presentaba
> la estructura mallinfo, además de controlar que se habían asignado
> correctamente el espacio a cada puntero.
>  
> Pues bien, hasta el puntero nro. 10 no me devolvió un puntero nulo,
> es decir que no tenía espacio de memoria.
> pero la información que presentaba de mallinfo era incoherente.
> La primera vez, antes de asignar nada, todos los campos devolvían
> la cantidad de 134.451.819 y después de la
> primera asignación devolvían 0, pero hasta la 10 asignación el sistema me
dejó asignar memoria.
>  
> Os envio el programa que hice para testear y presentar la
> estructura mallinfo. ¿Dónde me equivoco?. ¿hay que ini
> cializar mallinfo de alguna forma?.

Buscando un poco de la documentación empolvada de C, encontré que
mallinfo es una función que está asociada a una estructura con el
mismo nombre y que devuelve el estado de dicha estructura. Por lo
tanto si no invocas a la función que le actualiza los valores de la
instancia de dicha estructura, obtendrás esos valores "alocados"
que te devuelve a ti.

> P.D. En el programa hay funciones, macros propias y definiciniones,
> como Locate ,LOCATE. Y Pulse_Una_Tecla()

Pienso que si nos ahorras a nosotros tener que quitar estas partes de
código para poder probar tu código, y nos da más deseo de ayudarte ;-)

Un acercamiento a tu código, sin usar tus cosas es el siguiente:

#include <stdio.h>
#include <stdlib.h>

// incluyo a este porque dice la documentación que son parte del
// estándar SVID/XPG y están declarada en dicho include
#include <malloc.h>

int Presenta_Info(char *_m)
  {
    struct mallinfo _p;
    _p = mallinfo();

    printf("Arena     =%d\n", _p.arena);
    printf("ordblks   =%d\n", _p.ordblks);
    printf("smblks    =%d\n", _p.smblks);
    printf("hblks     =%d\n", _p.hblks);
    printf("hblkhd    =%d\n", _p.hblkhd);
    printf("usmblks   =%d\n", _p.usmblks);
    printf("fsmblks   =%d\n", _p.fsmblks);
    printf("uordblks  =%d\n", _p.uordblks);
    printf("fordblks  =%d\n", _p.fordblks);

    getchar();

    return 0;
  }

int main(void)
  {
    char *_a[1000], men[20];
    int x;

    printf("Inicio\n");
    for(x = 0; x < 1000; ++x)
      {
        if( (_a[x] = (char *)malloc(100000000)) == NULL )
          {
            printf("No tengo memoria _a\n");
            break;
          }

        sprintf(men, "_a[%d]", x);

        Presenta_Info(men);
      }

    return 0;
  }

Espero que vayamos encontrando el camino.

-- 
Saludos,
 Gilberto Cuba Ricardo








Más información sobre la lista de distribución Cconclase