Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: guero en 6 Julio 2020, 05:31 am



Título: MEMORIA SIN LIBERAR C++
Publicado por: guero en 6 Julio 2020, 05:31 am
Hola, tengo una consulta. Hay alguna manera para mostrar por pantalla al usuario que NO quedó memoria sin liberar? Existe una exception de este tipo? Estuve buscando en internet y no encontré nada de eso.


Gracias!


Título: Re: MEMORIA SIN LIBERAR C++
Publicado por: K-YreX en 6 Julio 2020, 05:44 am
Existen opciones como valgrind (para Linux) que te permiten ejecutar un programa y al finalizar te muestra información entre la que se encuentra la cantidad de memoria sin liberar o los errores que se hayan producido durante la ejecución.
Con esto puedes probar tu programa y ver que no queda memoria sin liberar antes de su finalización.

Pero obviamente estas herramientas no están destinadas a ser usadas por el usuario final sino por el desarrollador. Debes ser tú quien pruebe tus programas con alguna herramienta del estilo para ver que no queda memoria sin liberar.


Título: Re: MEMORIA SIN LIBERAR C++
Publicado por: guero en 6 Julio 2020, 05:50 am
Gracias por responder!
Claro, conozco Valgrind pero mi idea era (para un trabajo de la escuela) poder mostrarle con un throw que confirme que se liberó toda la memoria.


Título: Re: MEMORIA SIN LIBERAR C++
Publicado por: Meta en 6 Julio 2020, 16:47 pm
¿Cómo puedes saber que no se liberó memoria y cuando se se liberó?


Título: Re: MEMORIA SIN LIBERAR C++
Publicado por: K-YreX en 6 Julio 2020, 21:04 pm
Gracias por responder!
Claro, conozco Valgrind pero mi idea era (para un trabajo de la escuela) poder mostrarle con un throw que confirme que se liberó toda la memoria.
Desconozco si existe alguna manera de mostrar eso tal y como quieres pero la verdad me extraña que exista. Al final al que le importa que se libere la memoria no es al usuario sino al desarrollador y éste último tiene a su alcance herramientas externas para comprobar que la memoria está liberada ante cualquier finalización del programa.

¿Cómo puedes saber que no se liberó memoria y cuando se se liberó?
Cuando se habla de liberar memoria se hace referencia a la que se reserva de manera dinámica usando funciones como: malloc()/realloc()/calloc() (en C) o new() (en C++). Esta memoria tiene que ser liberada de forma manual con: free() (en C) o delete() (en C++).
Por ejemplo puedes usar herramientas como valgrind (en Linux) y ejecutar:
Código:
$ gcc free_memory.c -o free_memory
$ valgrind ./free_memory
Y se ejecutará tu programa de manera normal para después indicarte si ha quedado memoria no liberada:
Código:
==11393== Command: ./free_memory 
==11393== HEAP SUMMARY:
==11393==     in use at exit: 10 bytes in 1 blocks
==11393==   total heap usage: 3 allocs, 2 frees, 2,058 bytes allocated
==11393==
==11393== LEAK SUMMARY:
==11393==    definitely lost: 10 bytes in 1 blocks
==11393==    indirectly lost: 0 bytes in 0 blocks
==11393==      possibly lost: 0 bytes in 0 blocks
==11393==    still reachable: 0 bytes in 0 blocks
==11393==         suppressed: 0 bytes in 0 blocks
==11393== Rerun with --leak-check=full to see details of leaked memory
==11393==
==11393== For counts of detected and suppressed errors, rerun with: -v
==11393== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Como te indica ahí, puedes usar otros parámetros para la ejecución de valgrind para obtener más información.

La salida del mismo programa liberando la memoria dinámica con free():
Código:
==11457== HEAP SUMMARY:
==11457==     in use at exit: 0 bytes in 0 blocks
==11457==   total heap usage: 3 allocs, 3 frees, 2,058 bytes allocated
==11457==
==11457== All heap blocks were freed -- no leaks are possible
==11457==
==11457== For counts of detected and suppressed errors, rerun with: -v
==11457== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)


Título: Re: MEMORIA SIN LIBERAR C++
Publicado por: Loretz en 7 Julio 2020, 07:22 am
Una forma muy usada, en particular por MFC de Microsoft es el Debug_new donde se usan macros para detectar memory leaks, del tipo

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

El artículo original, con todas las explicaciones, y el link de descarga de debug_new.h que implementa esta técnica está en

http://wyw.dcweb.cn/leakage.htm


Título: Re: MEMORIA SIN LIBERAR C++
Publicado por: Meta en 7 Julio 2020, 14:41 pm
Gracias por la explicación muy desarrollada.  ;-)