Instanzen löschen ◦ Zusammenfassung ◦ ?

Für Objektvariablen gelten dieselben Regeln bezüglich Gültigkeitsbereich und Lebensdauer (Lebenszyklus) wie für andere Variablen. Als Gültigkeitsbereich einer Variablen oder einer Prozedur bezeichnet man den Abschnitt eines Programms, von dem aus darauf zugegriffen werden kann. Als Lebensdauer wird die Zeitspanne bezeichnet, in welcher der Wert einer Variablen gespeichert bleibt. Auf eine Variable, die innerhalb einer Prozedur vereinbart wurde, kann man nur innerhalb der Prozedur zugreifen, und ihr Wert geht beim Verlassen der Prozedur verloren. Alle Variablen, die im Vereinbarungsabschnitt eines Moduls deklariert wurden, behalten ihren Wert, bis die Anwendung geschlossen wird.

Auf welche Objekte verweisen also die Variablen im folgenden Programmbeispiel, jeweils nach Ausführung der nummerierten Zeilen?

Standardmodul: modTest

    Private Eintrag1 As cEintrag
                                   '(a)
    Sub Test()
      Dim Temp1 As cEintrag
      Dim Temp2 As cEintrag
                                   '(b)
      Set Temp1 = New cEintrag
      Set Temp2 = New cEintrag
                                   '(c)
      Set Eintrag1 = Temp1
                                   '(d)
    End Sub

Das folgende Bild veranschaulicht die Variableninhalte vor Eintritt in die Prozedur Test() bis kurz vor dem Verlassen. Die globale Objektvariable Eintrag1 wird beim Start der Anwendung erstellt und mit Nothing initialisiert (a). Temp1 und Temp2 sind lokal und entstehen deshalb erst mit dem Aufruf von Test(). Auch sie werden mit Nothing initialisiert (b). Als nächstes werden zwei Instanzen der Klasse cEintrag erstellt und die Verweise in Temp1 und Temp2 gespeichert (c). Die letzte Zeile lässt schliesslich die Variable Eintrag1 auf dasselbe Objekt verweisen wie Temp1 (d).

Was passiert nun mit den beiden Instanzen, wenn die beiden Variablen Temp1 und Temp2 nach Verlassen der Prozedur ihre Werte verlieren? Instanz1 muss bestehen bleiben, da man über die globale Variable Eintrag1 weiterhin darauf zugreifen kann. Instanz2 verliert dagegen ihre einzige Referenz Temp2 und ist somit nie wieder erreichbar. Sie kann gelöscht werden, da sie nur noch unnötig Speicherplatz belegt.

Visual Basic integriert einen Speicherbereinigungsmechanismus (engl. garbage collection), der Instanz1 erhält und Instanz2 automatisch löscht. Er funktioniert, indem er für jedes Objekt einen Zähler verwaltet, der die Verweise auf das Objekt zählt. Erreicht ein Zähler einen Zählerstand kleiner als Eins, so wird das zugehörige Objekt gelöscht.

Möchte man eine Instanz explizit löschen, so muss man einfach alle Verweise darauf entfernen. Man entfernt einen Verweis auf ein Objekt, indem man die Objektvariable auf ein anderes Objekt oder auf Nothing zeigen lässt. Die folgende Prozedur erstellt beispielsweise ein Objekt und löscht es anschliessend gleich wieder.

    Private Eintrag1 As cEintrag

    Sub Test()
      Set Eintrag1 = New cEintrag
      Set Eintrag1 = Nothing
    End Sub

Wegen des Speicherbereinigungsmechanismus braucht man sich unter Visual Basic über das Löschen von Objekten kaum Gedanken zu machen. Man sollte jedoch folgende Regel beherzigen, damit der Mechanismus optimal zum Tragen kommt: Variablen sollten immer 'so lokal wie möglich' vereinbart werden. Die Regel beschränkt die Lebensdauer der Variablen auf ein Minimum und sorgt dafür, dass Speicherplatz nur solange wie nötig belegt wird. Ausserdem vermeidet sie Fehlerquellen und erhöht die Lesbarkeit von Programmen. Sie gilt allgemein für Variablen, nicht nur für Objektvariablen.

Instanzen löschen

©abo