Ist die Löschung von Objekten / die Zuordnung von Arrays in VB6 / VBA wirklich notwendig? (Pro / Contra?)

8

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?

    
Oorang 06.10.2009, 13:58
quelle

5 Antworten

4

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.

    
Mike Hofer 06.10.2009, 16:10
quelle
13

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.

    
onedaywhen 06.10.2009 15:21
quelle
2

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.

    
MarkJ 07.10.2009 10:55
quelle
0

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.

    
JonH 06.10.2009 14:05
quelle
-2

Ja, setze alle Objekte auf Nichts und räume so viel wie möglich auf. VB6 ist berüchtigt dafür, Speicherlecks zu haben, wenn Sie Ihre Sachen nicht aufräumen. Garbage Collection war in VB6 / VBA untergeordnet.

    
HardCode 06.10.2009 14:31
quelle

Tags und Links