Sto lavorando su un grande progetto C ++. Consiste in un server che espone un'API REST, fornendo un'interfaccia semplice e intuitiva per un sistema molto ampio che comprende molti altri server. Il codebase è abbastanza grande e complesso e si è evoluto nel tempo senza un design adeguato. Il mio compito è implementare nuove funzionalità e refactoring / correggere il vecchio codice per renderlo più stabile e affidabile.
Al momento, il server crea un numero di oggetti longevi che non vengono mai terminati né eliminati al termine del processo. Ciò rende Valgrind quasi inutilizzabile per il rilevamento delle perdite, in quanto è impossibile distinguere tra le migliaia di perdite (discutibili) legittime da quelle "pericolose".
La mia idea è di assicurare che tutti gli oggetti siano disposti prima della risoluzione, ma quando ho fatto questa proposta, i miei colleghi e il mio capo mi hanno opposto sottolineando che il sistema operativo libererà comunque quella memoria (che è ovvio per tutti) e lo smaltimento degli oggetti rallenterà l'arresto del server (che al momento è sostanzialmente una chiamata a std::exit
). Ho risposto che avere una procedura di spegnimento "pulita" non implica necessariamente che si debba usarlo. Possiamo sempre chiamare std::quick_exit
o solo kill -9
del processo se ci sentiamo impazienti.
Hanno risposto che "la maggior parte dei daemon e dei processi di Linux non si preoccupano di liberare memoria all'arresto". Mentre riesco a vederlo, è anche vero che il nostro progetto ha bisogno di debugging della memoria accurato, in quanto ho già riscontrato problemi di corruzione della memoria, doppie libertà e variabili non inizializzate.
Quali sono i tuoi pensieri? Sto perseguendo uno sforzo inutile? In caso contrario, come posso convincere i miei colleghi e il mio capo? Se sì, perché, e cosa dovrei fare invece?