Wann muss ich eine variable auf "Nichts" in VB6?
In einem meiner VB6 Formen, ich mehrere andere Form von Objekten und speichert Sie in den Variablen.
Private m_frm1 as MyForm
Private m_frm2 as MyForm
// Later...
Set m_frm1 = New MyForm
Set m_frm2 = New MyForm
Ich bemerken, dass ich ein Speicherleck, wenn diese (Eltern) - Formular erstellt und zerstört. Ist es notwendig für mich zu ordnen Sie diese member-Variablen zu Nothing
im Form_Unload()
?
Im Allgemeinen, Wann ist das erforderlich?
GELÖST: Diese Besondere Speicherverlust wurde behoben, wenn ich ein Unload
auf die Formen in Frage, nicht wenn ich die form Nothing
. Konnte ich entfernen, ein paar andere Speicherlecks durch das explizite setzen von Instanzen der Klasse Module Nothing
sowie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Matt Dillard - Hat diese Einstellung nichts Ihre Speicherverlust beheben?
VB6 nicht über eine formale garbage collector, mehr entlang der Linien von dem, was @Konrad Rudolph sagte.
Tatsächlich ruft unload auf Ihre Formen scheint mir der beste Weg, um sicherzustellen, dass die main-form ist aufgeräumt und dass jedes Unterformular reinigt Ihre Aktionen.
Getestet habe ich diese mit einem leeren Projekt und zwei leere Formen.
Nach der Ausführung beide Formen sind sichtbar gelassen. Einstellung frm zu nichts gut Tat... nichts.
Nach settign frm zu nichts, die behandeln nur offen für diese form ist über der Referenz.
Sehe ich das problem richtig?
Eigentlich VB6 implementiert RAII wie C++, was bedeutet, dass lokal deklariert Verweise automatisch setzen zu
Nothing
am Ende eines Blocks. Ebenso sollte automatisch zurückgesetzt, Mitglied der class-Variablen nach der AusführungClass_Terminate
. Allerdings gab es mehrere Berichte, dass dies geschieht nicht zuverlässig. Ich erinnere mich an keine strenge Prüfung, doch es ist immer am besten Praxis, um reset member-Variablen manuell.@Martin
Mit/endet Mit nicht so läuft, wie die Using-Anweisung, Sie nicht "Entsorgen", am Ende der Anweisung.
Mit/endet Mit Werken in VB 6 so wie es in VB.Net es ist im Grunde ein Weg, um Kontextmenü Objekt-Eigenschaften/Methoden aufrufen. z.B.
Mit aCustomer
.FirstName = "John"
.LastName = "Smith"
Ende Mit
Objekte in VB haben Verweiszählung. Dies bedeutet, dass ein Objekt hält eine Zählung, wie viele andere Objektvariablen einen Verweis auf Sie. Wenn es keine Referenzen auf das Objekt, das Objekt bei der Speicherbereinigung (irgendwann). Dieser Prozess ist Teil von der COM-Spezifikation.
In der Regel, wenn ein lokal instanziiert Objekt den Gültigkeitsbereich verlässt (D. H. beendet das sub), dessen reference count down " geht von einer, in anderen Worten, die variable, die Verweise auf das Objekt zerstört wird. Also in den meisten Fällen müssen Sie nicht explizit ein Objekt gleich gar Nichts beim verlassen einer Sub.
In allen anderen Fällen müssen Sie explizit festlegen, eine object-variable Nichts, um zu verringern Ihre Referenz, Anzahl (von einem). Einstellung eine Objekt-variable Nothing ist, wird nicht unbedingt das Objekt löschen, müssen Sie ALLE Verweise auf Nichts. Dieses problem kann besonders akut mit rekursiven Datenstrukturen.
Andere gotcha ist, wenn mit dem New-Schlüsselwort in einer Objekt-Variablen-Deklaration. Ein Objekt wird nur erstellt, bei der ersten Verwendung, nicht an der Stelle, wo das New-Schlüsselwort verwendet wird. Mit dem New-Schlüsselwort in der Deklaration wird das Objekt neu erstellen bei der ersten Verwendung jedes mal, wenn sein Referenzzähler auf null geht. Daher ist die Festlegung eines Objekts zu Nichts kann es zerstören, aber das Objekt wird automatisch erstellt wenn wieder referenziert. Idealerweise sollten Sie nicht erklären, mit dem New-Schlüsselwort, aber durch die Verwendung des New-operators, die nicht über diese Auferstehung Verhalten.
Streng genommen nie, aber es gibt der garbage collector ein starker Hinweis, Dinge zu bereinigen.
Regel: tun es jedes mal, wenn Sie fertig sind, mit einem Objekt, das Sie erstellt haben.
Einstellung ein VB6-Referenz auf Nichts, sinkt die refecences Anzahl der VB hat für das Objekt. Wenn, und nur wenn der Zähler null ist, dann wird das Objekt zerstört werden.
Denke nicht, dass nur weil Sie zu Nichts, es wird "Müll gesammelt" wie in .NET
VB6 verwendet ein Referenz-Zähler.
Sind Sie aufgefordert, auf "Nichts" instanziert Objekte, um die referece zu C/C++ - code und so ein Zeug. Es ist schon eine lange Zeit, da ich Sie berührte, VB6, aber ich erinnere mich Einstellung Dateien und Ressourcen zu nichts.
In jedem Fall wird es nicht Schaden, (wenn es Nichts war, das schon), aber das bedeutet nicht, dass das Objekt zerstört werden.
VB6 hatte eine "Mit/End With" - Anweisung, funktioniert "wie" der Using () - Anweisung in C#.NET. Und natürlich, je weniger Globale Dinge, die Sie haben, desto besser für Sie.
Denken Sie daran, dass, in jedem Fall, manchmal die Schaffung eines großen Objekts ist teurer als das halten einer Referenz lebendig und wiederverwendet.
Using
- Schlüsselwort in C# ist nicht wie VB6 istWith
block.Using
ist fürIDisposable
Implementierungen und VB6 hat keine ähnliche Funktion.Ich hatte ein problem ähnlich wie diese eine Weile zurück. Ich glaube, es würde auch verhindern, dass die app geschlossen wird, aber es kann auch hier anwendbar.
Zog ich den alten code und es sieht etwas wie:
Kann es sicherer sein, um das Entladen der m_frm1. und nicht einfach nichts.
Einen wichtigen Punkt, der bisher noch nicht erwähnt worden ist hier, die Einstellung eine Referenz auf ein Objekt zu Nichts führen wird das Objekt der Destruktor ausgeführt (Class_Terminate wenn die Klasse wurde geschrieben in VB), wenn es keine weiteren Referenzen auf das Objekt (reference count ist null).
In einigen Fällen, insbesondere bei Verwendung eines RAII-pattern, die Kündigung-code können Sie code ausführen, kann eine Fehlermeldung ausgeben. Ich glaube, dies ist der Fall mit einigen der ADODB-Klassen. Ein anderes Beispiel ist eine Klasse, kapselt Datei-i/o - code in Class_Terminate könnten versuchen, sich zum leeren und schließen Sie die Datei, wenn es noch offen ist, kann einen Fehler auslösen.
Daher ist es wichtig, sich bewusst sein, dass die Festlegung einer Objekt-Referenz auf Nothing kann einen Fehler auslösen, und behandeln Sie entsprechend (wie genau, hängt von Ihrer Anwendung - zum Beispiel könnten Sie ignorieren solche Fehler durch einfügen von "On Error Resume Next" vor-Satz "... = Nothing").