Estou trabalhando em um grande projeto C ++. Consiste em um servidor que expõe uma API REST, fornecendo uma interface simples e amigável para um sistema muito amplo, que compreende muitos outros servidores. A base de código é bastante grande e complexa e evoluiu ao longo do tempo sem um design adequado inicial. Minha tarefa é implementar novos recursos e refatorar / corrigir o código antigo para torná-lo mais estável e confiável.
No momento, o servidor cria vários objetos de vida longa que nunca são finalizados nem descartados quando o processo termina. Isso torna o Valgrind quase inutilizável para a detecção de vazamentos, pois é impossível distinguir entre os milhares de (questionavelmente) vazamentos legítimos dos "perigosos".
Minha idéia é garantir que todos os objetos sejam descartados antes do término, mas quando eu fiz essa proposta, meus colegas e meu chefe se opuseram a mim, apontando que o sistema operacional liberaria essa memória de qualquer maneira (o que é óbvio para todos) e descartaria os objetos. desacelerará o desligamento do servidor (que, no momento, é basicamente uma chamada para std::exit
). Respondi que ter um procedimento de desligamento "limpo" não implica necessariamente que se deva usá-lo. Sempre podemos ligar std::quick_exit
ou apenas kill -9
o processo, se nos sentimos impacientes.
Eles responderam que "a maioria dos daemons e processos do Linux não se preocupam em liberar memória no desligamento". Embora eu possa ver isso, também é verdade que nosso projeto precisa de depuração de memória precisa, pois eu já encontrei corrupção de memória, liberações duplas e variáveis não inicializadas.
Quais são seus pensamentos? Estou perseguindo um esforço inútil? Caso contrário, como convencer meus colegas e meu chefe? Se sim, por quê e o que devo fazer?