Eine Menge von dem, was ich über VB gelernt habe, habe ich aus der Verwendung der statischen Code-Analyse (insbesondere Aivostos Project Analyzer) gelernt. Und eines der Dinge, die es überprüft, ist, ob Sie alle Objekte und Arrays gelöscht haben oder nicht. Ich habe das nur blind getan, weil PA das gesagt hat. Aber jetzt, da ich ein bisschen mehr darüber weiß, wie VB Ressourcen freisetzt, scheinen mir diese Dinge automatisch zu passieren. Ist dies ein Legacy-Feature von pre VB6, oder gibt es einen Grund, warum Sie Objekte explizit auf nichts zurücksetzen und auf Arrays löschen verwenden sollten?
Das Problem, so wie ich es verstehe, hat mit der Tatsache zu tun, dass VB6 (und seine Vorgänger) seine Wurzeln in COM und seinem zählenden Garbage-Collection-System hat.
Stellen Sie sich zum Beispiel vor, dass Sie einen Verweis auf ein Objekt aus einer Bibliothek eines Drittanbieters deklarieren. Dieses Objekt verfügt über eine COM-Verweisanzahl, die verwendet wird, um es am Leben zu erhalten und festzustellen, wann es zerstört werden sollte. Es wird nicht zerstört, wenn Sie es auf Nothing setzen, aber wenn die Referenzzahl des Objekts Null erreicht.
Nun wurden nicht alle COM-Komponenten in Visual Basic geschrieben. Einige wurden in C oder C ++ geschrieben. Die strukturierte Ausnahmebehandlung war nicht in allen Sprachen vorhanden. Wenn also ein Fehler auftrat, konnte die Anzahl der Referenzen für das Objekt nicht garantiert reduziert werden, und es war bekannt, dass COM-Objekte länger herumhingen, als sie eigentlich gedacht waren. Dies war mit Visual Basic an sich kein Problem. Es war ein COM-Problem. (Und das ist vielleicht der Grund, warum .NET keine Referenzzählung verwendet.)
Aus diesem Grund wurden Visual Basic-Entwickler zwanghaft, Objektverweise vor dem Beenden von Routinen freizugeben. Sie wissen einfach nicht, was eine Komponente, die Sie zuweisen, unter der Haube erstellt. Aber wenn Sie Ihre Referenz darauf veröffentlichen, geben Sie zumindest Ihre Referenzzahl frei. Es wurde fast ein religiöses Mantra. Deklarieren, verwenden, freigeben. Es war der COM-Weg, Dinge zu tun.
Sicher, Visual Basic könnte besser oder schneller bei der Dereferenzierung von Variablen sein, die ich auf dem Stack deklariert habe. Aber verdammt, ich möchte, dass es offensichtlich ist, dass diese Objekte veröffentlicht wurden. Wenn Sie versuchen, ein Speicherleck zu finden, reicht ein wenig Sicherheit.
Matt Curland, Autor von Advanced Visual Basic 6 , der mehr über Visual Basic weiß als die meisten von uns wird, denkt es ist verschwendete Anstrengung. Betrachten Sie dieses Zitat (p110) über DAO, die COM-Datenzugriffsbibliothek, die hauptsächlich auf die Access-Datenbank-Engine abzielt:
ein weiteres Beispiel für einen schlechten Teardown-Code. DAO hat Close-Methoden, die sein müssen in der richtigen Reihenfolge aufgerufen, und die Objekte müssen in der freigegeben werden korrekte Reihenfolge (Recordset vor der Datenbank zum Beispiel). Dies einzelnes schlechtes Objektmodellverhalten hat führte zu dem Missverständnis, dass VB leckt Speicher, wenn Sie nicht explizit alle festlegen die lokalen Variablen zu nichts an der Ende einer Funktion. Das ist ein völlig falsche Vorstellung in a gut entworfenes Objektmodell. VB kann Löschen Sie die Variablen am Ende schneller Unterzeile als Sie aus dem Code und es überprüft die Variablen auch wenn Sie geben Sie Ihre Referenzen explizit frei. Jede Anstrengung, die du machst, wird dupliziert.
Haben Sie diese Aivosto-Webseite (von den Machern von Project Analyzer) gelesen?
Wenn Sie statische Variablen verwenden, Es ist wichtig, die Erinnerung zurückzugewinnen Sie haben besetzt, wenn Sie das nicht brauchen Variablen mehr. Mit Dynamik Variablenspeicher ist nicht so viel von a Problem, weil sie zerstört sind wenn der Vorgang endet.
Mit anderen Worten, Sie müssen sich nicht darum kümmern, gewöhnliche, nicht statische lokale Variablen zu löschen.
Ich tue es immer für eine gute Übung, du weißt nie, was eine Ausnahme tun könnte, wenn du in einen fallst und deine Objekte nicht freigegeben werden. Sie sollten sie in finally-Anweisungen veröffentlichen und sicherstellen, dass sie keinen Speicher verwenden, da andernfalls ein Speicherverlust auftritt.
Ich hatte ein Problem innerhalb eines einfachen Time-off-Tracker-Systems, bei dem der Server immer wieder zufällig abstürzte. Es dauerte Wochen, um festzustellen, dass es sich um ein Speicherleck eines Objekts handelte, das sich selbst zerstören sollte. Mein Code wurde in eine Exception geworfen und wurde nie wieder gelöscht, nachdem der Server (die eigentliche Website, nicht der gesamte Server) heruntergefahren wurde.
Tags und Links vba vb6 static-analysis