Ist Objekt Clearing / array Deallokation wirklich notwendig in VB6 / VBA (Vor- / Nachteile?)

StackOverflow https://stackoverflow.com/questions/1525772

  •  20-09-2019
  •  | 
  •  

Frage

Eine Menge von dem, was ich gelernt habe, über VB ich verwendet statische Code-Analyse gelernt (Vor allem Aivosto Project Analyzer). Und man eines der Dinge für sie überprüft ist, ob Sie alle Objekte und Arrays gelöscht. Früher habe ich nur diese blind machen, weil PA gesagt. Aber jetzt, wo ich ein bisschen mehr über die Art und Weise VB Ressourcen frei wissen, scheint es mir, dass diese Dinge automatisch geschehen soll. Ist das ein Vermächtnis Funktion von pre VB6, oder gibt es einen Grund, warum Sie sollten explizit festgelegt Objekte zu nichts und Verwendung Erase auf Arrays zurück?

War es hilfreich?

Lösung

Das Problem, wie ich es verstehe, hat mit der Tatsache zu tun, dass VB6 (und seine Vorgänger) seine Wurzeln in COM haben, und sein Referenzzählung Garbage-Collection-System.

Stellen Sie sich vor, zum Beispiel, dass Sie eine refernece auf ein Objekt aus einer 3rd-Party-Bibliothek erklären. Das Objekt verfügt über einen COM Referenzzähler, die beide verwendet werden, es am Leben zu erhalten und zu bestimmen, wann sie vernichtet werden soll. Es wird nicht zerstört, wenn Sie es auf Nothing festgelegt, aber wenn das erreicht Objektreferenzzähler Null.

Nun, nicht alle COM-Komponenten wurden in Visual Basic geschrieben. Einige von ihnen wurden in C oder C ++ geschrieben. Strukturierte Ausnahmebehandlung gab es nicht in allen Sprachen. Also, wenn ein Fehler aufgetreten ist, wurde der Referenzzähler für das Objekt nicht garantiert richtig reduziert werden, und COM-Objekte wurden bekannt zu hängen, um länger als sie gedacht waren. Das war kein Problem mit Visual Basic, per se. Es war ein COM Problem. (Und das, könnte man beachten, ist, warum .NET nicht Verweiszählung nicht verwendet.)

Das ist, warum Visual Basic-Entwickler wurde obsessive über das Objekt Freigabe Referenzen vor dem Beenden-Routinen. Sie wissen einfach nicht, was eine Komponente Sie Zuteilung unter der Haube schafft. Aber wenn Sie Ihre Referenz loslassen, sind Sie zumindest die Freigabe Ihrer Referenzzähler zu. Es wurde fast ein religiöses Mantra. Declare, Nutzung, Veröffentlichung. Es war der COM-Weg, Dinge zu tun.

Sicher, Visual Basic könnte besser sein, oder schneller bei dereferencing Variablen, die ich auf dem Stapel deklariert. Aber verdammt noch mal, ich will es offensichtlich sein, dass diese Objekte freigelassen wurden. Ein wenig Sicherheit geht ein langer Weg, wenn Sie ein Speicherleck aufzuspüren versuchen.

Andere Tipps

Matt Kurland, Autor von Advanced Visual Basic 6 , wer weiß mehr über Visual Basic als die meisten von uns jemals wird, denkt, dass es vergebliche Mühe ist. Betrachten Sie dieses Zitat (p110) über DAO, die COM-Datenzugriffsbibliothek, die die Access-Datenbank-Engine in erster Linie Ziele:

  

ein weiteres Beispiel für eine 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   richtige Reihenfolge und (Re-Cord   vor Datenbank, zum Beispiel). Diese   Einzel schlechtes Objektmodell Verhalten   zu der irrigen Annahme geführt, dass VB Lecks   Speicher, wenn Sie ausdrücklich alle gesetzt   die lokalen Variablen zu nichts an der   Ende einer Funktion. Das ist ein   völlig falsche Vorstellung, in einem   Objektmodell gut gestaltete. VB Dose   deaktivieren Sie die Variablen am Ende schneller   Sub Linie, als Sie von Code können, und   es überprüft die auch Variablen, wenn Sie   ausdrücklich Ihre Referenzen freigeben.   Jeder Versuch, Sie machen dupliziert.

Haben lesen Sie diese Aivosto Webseite (von den Machern von Project Analyzer)?

  

Wenn Sie statische Variablen verwenden,   es ist wichtig, um den Speicher zurückfordern   sie eingenommen wird, wenn Sie das nicht brauchen   Variablen mehr. mit dynamischem   Speichervariablen ist nicht so viel von einem   Problem, weil sie zerstört werden   wenn die Prozedur endet.

Mit anderen Worten: Sie müssen nicht über Clearing gewöhnliche sorgen müssen, nicht statisch, lokale Variablen.

Ich mache es immer für eine gute Praxis, man weiß nie, was eine Ausnahme vielleicht tun, wenn Sie in ein und Ihre Objekte fallen, werden nicht freigegeben. Sie sollten sie in schließlich Aussagen Relase und sicherzustellen, dass sie keine Erinnerung sonst verwenden Sie in einen Speicherverlust führen kann.

ich ein Problem innerhalb einer einfachen Zeit off-Tracker-System hatte, wo der Server auf Absturz zufällig gehalten, dauerte es Wochen, um zu bestimmen es ein Speicherverlust eines Objekts war, die sich selbst zu zerstören auf seinem eigenen sollte. Mein Code wurde in eine Ausnahme geworfen und nie nach sich selbst gereinigt wodurch der Server (die tatsächliche Website nicht der gesamte Server) gehen.

Ja, stellen Sie alle Objekte auf Nothing und aufzuräumen, so viel wie möglich. VB6 ist berüchtigt für Speicherlecks, die, wenn sie nicht Ihre Sachen aufzuräumen. Garbage Collection war unterdurchscnittlich in VB6 / VBA.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top