Liberar memoria

Iniciado por Upeksa, 17 Septiembre 2013, 18:15 PM

0 Miembros y 1 Visitante están viendo este tema.

Upeksa

Hola a todos:

He programado un código en C en un software de simulación de fluidos. En este código, hago unos 12 malloc con sus free correspondientes.
Mi código se ejecutará del orden de cientos de veces.
El problema es que, llegada una cierta cantidad de iteraciones, el programa me da un error de "out of memory". Haciendo un seguimiento en el uso de memoria RAM, efectivamente, me voy quedando paulatinamente sin memoria.
El programa no me da otro tipo de errores ni compilar ni en otro momento.
He comprobado muchas veces y no parece que tenga algún malloc sin free o mal asignado, pero podría ser que sí tuviese un problema de ese tipo pero no me esté dando cuenta.
Justo después de liberar mis matrices, pongo esa variable igual a NULL.
¿Alguna sugerencia?
Gracias por vuestra ayuda, un saludo

Eternal Idol

Si es para Windows baja las Debugging Tools for Windows, ahi tenes el UMDH para empezar.

Es dificil de saber sin ver el codigo pero hablas de matrices, asegurate de liberar cada uno de los elementos de las mismas si son dinamicos.

Cada vez que llames a malloc y free loggealo (como prefieras, en un archivo o por consola printf("reservando %p\r\n", mem); por ejemplo).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Alien-Z

¿Tu aplicación hace uso de recursos externos?, una base de datos, conexión a un servidor, etc.

Si dices que liberas toda la memoria reservada puede que el despordamiento se deba a que cargas información de otro lado y no lo estás controlando.

Upeksa

Cita de: Alien-Z en 17 Septiembre 2013, 19:03 PM
¿Tu aplicación hace uso de recursos externos?, una base de datos, conexión a un servidor, etc.

Si dices que liberas toda la memoria reservada puede que el despordamiento se deba a que cargas información de otro lado y no lo estás controlando.

Efectivamente, estoy conectado a un servidor y estoy leyendo memorias propias del software que estoy utilizando (que había creado previamente en otro código anterior, también con memorias dinámicas).

Perdonad que no publique mi código, pero básicamente consta de un preproceso que es un algoritmo de asignación de datos (cada celda en que se divide mi dominio debe buscar otra celda que cumpla una cierta condición). La información la guardo en una memoria propia del programa para después visualizarla. Este código no da problemas porque sólo se ejecuta una vez (pero libero memorias igualmente).

Después, el problema aparece en el postproceso que se repetirá cientos de veces: Me voy quedando sin memoria paulatinamente. Lo que hago es releer las memorias propias de mi programa, y crear matrices dinámicas en las que almaceno los datos de esta memoria, y finalmente, las libero(si no me he equivocado).

Para empezar, como se ha sugerido, voy a crear mensajes en mi código para asegurame que estoy liberando memoria correctamente (ya había creado mensajes que devuelven un error si el malloc ha fracasado).

Teniendo en cuenta que mi código se ejecutará muchas veces, ¿me recomendáis que sustituya mis malloc por calloc?

Gracias de nuevo, un saludo.