Estoy trabajando en un gran proyecto de C ++. Consiste en un servidor que expone una API REST, que proporciona una interfaz simple y fácil de usar para un sistema muy amplio que comprende muchos otros servidores. La base de código es bastante grande y compleja, y evolucionó a través del tiempo sin un diseño adecuado por adelantado. Mi tarea es implementar nuevas funciones y refactorizar / corregir el código antiguo para hacerlo más estable y confiable.
Por el momento, el servidor crea una serie de objetos de larga duración que nunca se terminan ni se eliminan cuando finaliza el proceso. Esto hace que Valgrind sea casi inutilizable para la detección de fugas, ya que es imposible distinguir entre los miles de fugas (cuestionables) legítimas de las fugas "peligrosas".
Mi idea es asegurar que todos los objetos se eliminen antes de la terminación, pero cuando hice esta propuesta, mis colegas y mi jefe se opusieron a mí señalando que el sistema operativo va a liberar esa memoria de todos modos (lo cual es obvio para todos) y desechando los objetos ralentizará el apagado del servidor (que, en este momento, es básicamente una llamada a std::exit
). Respondí que tener un procedimiento de apagado "limpio" no implica necesariamente que uno deba usarlo. Siempre podemos llamar std::quick_exit
o simplemente kill -9
el proceso si nos sentimos impacientes.
Respondieron "la mayoría de los demonios y procesos de Linux no se molestan en liberar memoria al apagar". Si bien puedo ver eso, también es cierto que nuestro proyecto necesita una depuración precisa de la memoria, ya que encontré corrupción de memoria, liberaciones dobles y variables no inicializadas.
¿Cuáles son tus pensamientos? ¿Estoy persiguiendo un esfuerzo inútil? Si no, ¿cómo puedo convencer a mis colegas y a mi jefe? Si es así, ¿por qué y qué debo hacer en su lugar?