[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