Ich fand durch Valgring, dass einige GTK + -Programme Speicher verlieren. Wie wichtig ist es, diese Undichtigkeiten zu beheben? Ich meine, oft funktionieren diese Programme sehr gut, aber andererseits kann man nie sicher sein, ob man einen Teil des leckenden Codes in ein anderes Programm kopieren möchte. Und ich bin mir nicht sicher, ob die Idee von GTK + -Programmen ist, schnell zu arbeiten, und daher gibt es Lecks.
Also, wenn ich manchmal ein Speicherleck in einem Open-Source-Programm finde, sollte ich es beheben oder gibt es zum Beispiel Effizienzprobleme und daher bestand die ursprüngliche Idee des Programmierers darin, einen kleinen undichten Code zu schreiben?
Antworten:
Wie wichtig es ist, Speicherlecks zu beheben, hängt von der Schwere des Problems ab und was Sie sonst noch tun müssen, ist wichtig. Ich habe die Erfahrung gemacht, dass kleine Speicherlecks für die meisten Anwendungen eher harmlos sind. Die Lebensdauer einer Desktop-App-Sitzung ist normalerweise nicht lang genug, um eine Beeinträchtigung aufgrund eines kleinen Speicherverlusts festzustellen.
Wenn Sie einen Server schreiben, der rund um die Uhr läuft, können sich mit der Zeit kleine Speicherverluste summieren und zu einem großen Problem werden. Aus diesem Grund planen viele Unternehmen einen täglichen oder wöchentlichen Neustart ihrer Server. Der Aufwand zum Auffinden von Speicherlecks ist im Verhältnis zu dem, was möglicherweise erzielt wird, oft sehr hoch. Daher ist es einfacher, die Server regelmäßig neu zu starten und sich wichtigeren Dingen zuzuwenden.
quelle
Bei kurz laufenden Programmen sind Speicherlecks nicht so wichtig. Das Betriebssystem fordert beim Beenden alles zurück, kann jedoch dazu führen, dass andere Ressourcen nicht freigegeben werden.
Unabhängig davon, wie kurz ein Leck ist, kann es innerhalb weniger Stunden außer Kontrolle geraten oder sich unbemerkt über Wochen stapeln.
Mein Rat ist, einen Fehler im Tracker mit einem vorgeschlagenen Fix zu melden, wenn es den Lead interessiert, wird er ihn reparieren.
Die Art des Lecks ist ebenfalls wichtig. Es ist möglich, dass es sich bei der Zuordnung um eine einmalige Zuordnung handelt, bei der sich der Entwickler bei der Bereinigung bewusst auf das Betriebssystem verlassen hat. Diese geben bei Valgrind ein falsches positives Ergebnis.
quelle
grep
durch eine sehr große Datei und Ihr Programm ein paar Bytes für jede Eingabezeile verlieren , könnte Ihnen der Speicher ausgehen.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 als
malloc
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 diemalloc
Aufrufe ersetzen, für die sie sich nicht umfree
etwas kümmernseq_malloc
, undseq_purge
einenatexit
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.
quelle
FWIW, wenn ein Benutzer ein Leck in einer Anwendung, an der ich arbeite, meldet, bin ich sehr geneigt, es zu beheben (insbesondere, wenn sie Code für die Fehlerbehebung in den Fehlerbericht aufgenommen haben!). Das heißt, es kann nicht sofort passieren, wenn das Leck klein ist und andere Probleme dringender sind (z. B. ein häufig auftretender Absturzfehler). Aber ich würde es definitiv begrüßen und daran arbeiten, es irgendwann zu beheben. Sie sollten sie auf jeden Fall wissen lassen. Sie werden es entweder zu schätzen wissen und daran arbeiten (höchstwahrscheinlich), oder es ist ihnen egal, und alles, was es Sie gekostet hat, ist etwas Zeit.
quelle