/ / La forma más limpia de hacer que GLPK se limpie en la terminación del programa - c ++, fugas de memoria, valgrind, glpk

La forma más limpia de hacer que GLPK se limpie en la terminación del programa - c ++, fugas de memoria, valgrind, glpk

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 № 1

Si 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).