Nach meiner zugegebenermaßen dogmatischen Meinung zu diesem Thema gibt es keine Entschuldigung für physische Lecks, zumindest in keiner Bibliothek, die eine breite Anwendbarkeit anstrebt. Daher würde ich versuchen, die GTK + -Entwickler so lange zu nerven, bis sie es selbst reparieren.
Es ist für eine Bibliothek trivial genug, atexit
Rückrufe zu registrieren , um jeden zugewiesenen Speicherplatz freizugeben, zumindest beim Entladen. Wenn es die Kosten einer Schiffsladung von Teeny-Zuweisungen vermeiden will, sollte es sie nicht an erster Stelle tun.
Sogar das faulste Programm, das nur eine Schiffsladung von winzigen Speicherblöcken gleichzeitig zuweisen möchte, könnte einen einfachen sequenziellen Allokator verwenden, der nur den gesamten Speicher beim Herunterfahren löscht. Wenn der Allokator sich nicht einmal mit der Ausrichtung befassen möchte, kann er einfach jeden einzelnen Block, den er bündelt, auf maximale Ausrichtungsgrenzen auffüllen. Wenn es in der Lage war, von kürzeren Abschaltzeiten zu profitieren, indem es nicht alle diese winzigen Speicherabschnitte einzeln freigab, dann kann es im Austausch für trivialen Aufwand auch sehr viel symmetrischer profitieren, wenn ein solcher sequentieller Allokator verwendet wird, der den Speicher direkt sequentiell mit zusammenfasst viel schneller Allokationen alsmalloc
und cachefreundlichere Speichermuster, damit alle großen Blöcke zusammenhängenden Speichers, die vom Zuweiser gepoolt wurden, freigegeben werden, wenn die Bibliothek fertig ist. Die Bibliothek muss dann lediglich die malloc
Aufrufe ersetzen, für die sie sich nicht um free
etwas kümmern seq_malloc
, und seq_purge
einen atexit
Rückruf anfordern, um den gesamten beim Entladen zugewiesenen Speicherplatz freizugeben.
Andernfalls wird diese fiese Bibliothek Nachrichten in Ihren Tools zur Speicherleckerkennung überladen, die Sie jetzt herausfiltern müssen. Schlimmer noch, wenn Sie sie nicht systematisch herausfiltern, können sie die Lecks in Ihrer eigenen Anwendung verschleiern und Ihre Kollegen könnten die Angewohnheit entwickeln, sie zu übersehen, was die Nützlichkeit der Lecksuchwerkzeuge in erster Linie mindert, um Ihr eigenes Team daran zu hindern Leaky Code drücken. Es ist eklig und hässlich, und vor allem finde ich die Argumente dafür nicht überzeugend, wenn man bedenkt, wie trivial es ist, die obige Lösung zu verwenden.
Logische Lecks (die komplexere Art, gegen die selbst die Garbage Collection keinen Schutz bietet) sind komplexer, und ich könnte eine Rechtfertigung dafür finden, dass kurzlebige Programme logische Lecks aufweisen, solange sie den gesamten zugewiesenen Speicher löschen Herunterfahren, da viel über Ressourcenverwaltung nachgedacht werden muss, um logische Lecks zu vermeiden (wohl eher in Sprachen mit GC). Aber ich finde keine vernünftige Entschuldigung, um physische Lecks zu vermeiden, wenn man bedenkt, wie trivial sie auch in den trägsten Kontexten zu vermeiden sind.
Jedenfalls würde ich zumindest die Lecks in Valgrind herausfiltern, damit sie zumindest nicht die Fähigkeit Ihres Teams beeinträchtigen, Ihre eigenen zu erkennen.