Sto lavorando a un grande progetto C ++. Consiste in un server che espone un'API REST, fornendo un'interfaccia semplice e intuitiva per un sistema molto ampio comprendente molti altri server. La base di codice è piuttosto ampia e complessa e si è evoluta nel tempo senza un adeguato design iniziale. Il mio compito è implementare nuove funzionalità e refactoring / correggere il vecchio codice al fine di renderlo più stabile e affidabile.
Al momento, il server crea un numero di oggetti di lunga durata che non vengono mai terminati né eliminati al termine del processo. Ciò rende Valgrind quasi inutilizzabile per il rilevamento delle perdite, poiché è impossibile distinguere tra le migliaia di (legittimamente) perdite legittime da quelle "pericolose".
La mia idea è quella di garantire che tutti gli oggetti siano eliminati prima della risoluzione, ma quando ho fatto questa proposta, i miei colleghi e il mio capo si sono opposti a me sottolineando che il sistema operativo libererà comunque quella memoria (che è ovvio per tutti) e disponendo gli oggetti rallenterà l'arresto del server (che, al momento, è fondamentalmente una chiamata a std::exit
). Ho risposto che avere una procedura di spegnimento "pulita" non implica necessariamente che si debba usarla. Possiamo sempre chiamare std::quick_exit
o semplicemente kill -9
il processo se ci sentiamo impazienti.
Hanno risposto "la maggior parte dei demoni e dei processi Linux non si preoccupano di liberare memoria allo spegnimento". Anche se posso vederlo, è anche vero che il nostro progetto ha bisogno di un accurato debug della memoria, poiché ho già trovato corruzione della memoria, doppia liberazione 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? In tal caso, perché e cosa devo fare invece?