![]() |
![]() |
Ein Destruktor |
G.Eichelsdörfer
Staatliche Technikerschule Weilburg |
Die kleine Klasse DoubleArray
ist mittlerweile recht flexibel im Einsatz.
Dazu trägt unter Anderem die im Konstruktor eingebaute Speicherallokation bei.
Wenn ein DoubleArray-Objekt angelegt wird, reserviert der Konstruktor im angelegten Objekt
den Speicherplatz für ein Datenfeld der geforderten Größe (Konstruktorparameter).
Es stellt sich nun allerdings die folgende Frage:
Weil der Datenfeldzeiger im Objekt private ist - und das ist gut so, kann die Freigabe nicht außerhalb des Objektes erfolgen. Es stellt sich auch die Frage
Die letzte Frage ist leicht zu beantworten:
Der allokierte Speicher ist dann freizugeben, wenn das DoubleArray-Objekt nicht mehr benötigt wird,
also wenn es "stirbt".
Hier ist ein ähnlicher Automatismus wie zum Initialisieren beim Anlegen des Objektes zweckmäßig.
Immer wenn ein Objekt entfernt wird, werden "Aufräumarbeiten" erledigt.
Nun, wo der Verantwortliche für diese Arbeiten gefunden ist, muss noch erörtert werden, wie ein solcher zu codieren ist. Während man in einer Klasse per Überladen mehrere Konstruktoren zur Verfügung stellen kann, gibt es in einer Klasse höchstens einen Destruktor.
Wann muss ein Destruktor erstellt werden?
Dies ist immer dann erforderlich, wenn eine Klasse Code zur Allokation von Speicher enthält.
Wenn Sie hingegen beispielsweise als Attribut ein std::string-Objekt verwenden, was eigenständig Speicher
allokiert, benötigen Sie dafür keinen Destruktor. Der Compiler sorgt am Ende ohnehin für den Aufruf
des std::string-Destruktors, der die Aufräumarbeiten für das string-Attribut erledigt.
Name für den Destruktor
Einen Destruktor erkennt der Compiler an seinem Namen. Er trägt, ähnlich wie ein Konstruktor, den Namen der Klasse
mit einer vorangestellten Tilde (~). Die Tilde stellt auch das so genannte Einerkomplement dar.
Ein Destruktor ist sozusagen das komplementäre Gegenstück zum Konstruktor. So waren vermutlich die Gedanken von
Herrn Stroustrup, dem Entwickler von C++.
Der Destruktor der Klasse DoubleArray
muss also ~DoubleArray
heißen.
Parameter und Resultatstyp eines Destruktors
Ein Destruktor wird nie explizit aufgerufen. In einem C++-Quelltext ist an keiner Stelle unmittelbar erkennbar,
dass ein Destruktor aufgerufen wird. Das ist von Vorteil, denn dort wo der Lebenszyklus eines Objektes endet,
setzt der Compiler von sich aus den Aufruf des Destruktors ein. Somit kann ein Destruktor keine Parameter
erhalten. Deshalb kann es in einer Klasse auch nur einen Destruktor geben.
Aus dem gleichen Grund kann er auch kein Resultat liefern.
Die Kopfzeile des Destruktors der Klasse DoubleArray
muss also lauten:
~DoubleArray()
Aufräumarbeiten des Destruktors
Hierzu gehört in erster Linie die Freigabe von allokiertem Speicher.
Die Klasse DoubleArray
sollte also den folgenden Destruktor besitzen:
~DoubleArray()
{delete[] Values;}
Bauen Sie diesen Destruktor in die Klasse DoubleArray
ein!
Diese Klasse wird im Folgenden erweitert.