Estoy usando el kit de programación lineal GNU en mi programa. Todo funciona bien, pero cuando verifiqué el programa con valgrind encontré algunas fugas de memoria:
==7051== 160 bytes in 1 blocks are still reachable in loss record 1 of 3
==7051== at 0x4C28BED: malloc (vg_replace_malloc.c:263)
==7051== by 0x52CFACB: glp_init_env (in /usr/lib/libglpk.so.0.30.0)
==7051== by 0x52CFC1C: ??? (in /usr/lib/libglpk.so.0.30.0)
==7051== by 0x52D0211: glp_malloc (in /usr/lib/libglpk.so.0.30.0)
==7051== by 0x52AC50A: glp_create_prob (in /usr/lib/libglpk.so.0.30.0)
Segun documentacion glp_init_env(void)
se llama en el primer uso de cualquier llamada de la API GLPK. Pero para limpiarlo, habría que llamar glp_free_env(void)
.
Quiero que mi programa esté libre de fugas de memoria y simplemente llame glp_free_env();
manualmente no es una buena solución para mí: tengo algunas pruebas unitarias escritas con Boost Unit Test Framework y quiero que no tengan fugas de memoria.
Lo ideal sería utilizar alguna función de C ++ que pudiera llamarlo automáticamente al finalizar el programa. ¿Conoces alguna forma simple y limpia de hacerlo?
Respuestas
1 para la respuesta № 1Si benjymous's respuesta no es apropiado por alguna razón u otra, std::atexit
puede ayudar:
int atexit( void (*func)() );
Registra la función apuntada por func para ser llamada en normal terminación del programa (a través de std :: exit () o regresando de la cpp / idioma / función principal)
1 para la respuesta № 2
Algo como esto debería funcionar
class CleanupOnExit
{
public:
~CleanupOnExit()
{
glp_free_env(void);
}
};
int main ()
{
CleanupOnExit cleanup;
.. do any processing here ..
return 0;
}
cleanup
"s destructor se llamará automáticamente al final de main
(incluso si regresa en el medio, o lanza una excepción).