Secondo la mia opinione dogmatica su questo argomento, non ci sono scuse per perdite fisiche almeno in qualsiasi biblioteca che mira ad essere ampiamente applicabile. Quindi cercherei di infastidire gli sviluppatori GTK + fino a quando non lo risolvono da soli.
È abbastanza banale che una libreria registri atexit
callback per liberare tutta la memoria che alloca almeno dopo essere stata scaricata. Se vuole evitare la spesa di un carico di stanziamenti per adolescenti, non dovrebbe in primo luogo farli.
Perfino il programma più pigro che vuole allocare un carico di memoria di pezzi di memoria per adolescenti allo stesso tempo potrebbe usare un semplice allocatore sequenziale che cancella tutta la memoria allo spegnimento. Se l'allocatore non vuole nemmeno occuparsi dell'allineamento, può semplicemente riempire ogni singolo blocco che raggruppa ai limiti massimi di allineamento. Se è stato in grado di beneficiare di tempi di spegnimento più rapidi non liberando tutti quei piccoli pezzi di memoria singolarmente, allo stesso modo si trarrà molto beneficio simmetricamente in cambio di uno sforzo banale utilizzando un allocatore sequenziale tale che raggruppa la memoria in modo immediatamente sequenziale con allocazioni molto più veloci dimalloc
e altri schemi di memoria compatibili con la cache, solo per liberare tutti i blocchi di memoria contigui raggruppati dall'allocatore al termine della libreria. Tutto ciò che la libreria deve fare è sostituire le loro malloc
chiamate per le quali non si preoccupano di free
qualcosa di simile seq_malloc
e chiamare seq_purge
un atexit
callback per liberare tutta la memoria allocata dopo essere stata scaricata.
Altrimenti hai questa cattiva libreria che ingombra i messaggi nei tuoi strumenti di rilevamento delle perdite di memoria che ora devi filtrare. Peggio ancora, se non li filtrate sistematicamente, potrebbero oscurare le perdite nella vostra applicazione e i vostri colleghi potrebbero sviluppare l'abitudine di trascurarli, riducendo in primo luogo l'utilità degli strumenti di rilevamento delle perdite per impedire al vostro team di spingendo il codice che perde. È brutto e brutto e soprattutto non trovo che gli argomenti a favore di farlo deliberatamente siano convincenti affatto dato quanto sia banale usare la soluzione sopra.
Le perdite logiche (il tipo più complesso da cui persino la garbage collection non è in grado di proteggere) sono un problema più complesso, e lì potrei trovare una giustificazione per i programmi di breve durata che hanno perdite logiche fintanto che eliminano tutta quella memoria su cui hanno allocato spegnimento poiché richiede molta riflessione sulla gestione delle risorse per evitare perdite logiche (probabilmente più nelle lingue che hanno GC). Ma non trovo alcuna scusa ragionevole per evitare perdite fisiche, dato che sono banali da evitare anche nei contesti più pigri.
Ad ogni modo, almeno filtrerei le perdite di Valgrind in modo che almeno non si scherzino con la capacità della tua squadra di individuare le tue.