Axel Rogat
Objektorientiertes Programmieren mit C++ und JAVA
 
11.6: Copy-Konstruktoren II Kapitel 11 12.1: Statische Datenmember 
 
  11.7 Destruktoren  
 

Der Destruktor ist das Gegenstück zu den Konstruktoren. Er tritt jedesmal in Aktion, wenn der Gültigkeitsbereich eines Objekts verlassen wird. Außerdem kann er explizit durch delete aufgerufen werden.

Die Datenmember selbst werden automatisch destruiert (durch rekursiven Aufruf ihrer Destruktoren). Wenn ein Destruktor explizit angegeben ist, geschieht dies direkt nach der Ausführung seines Rumpfs.

Es ist unumgänglich, mit Destruktoren zu arbeiten, wenn Klassen auf dynamischen Speicher zugreifen, der z.B. durch den Konstruktor beschafft wird und durch den Destruktor wieder freigegeben werden kann. In unserer C++-Version für int-Stacks hatten wir schon genau solch einen benutzt, der den Speicher der Knoten der intern geführten Liste freigab.

Weitere Anwendungen sind das Schließen von Dateien bei Datei-Objekten oder das Entfernen aus globaleren Datenstrukturen etwa zur Buchführung über die Objekte (Zählen, Verkettung in einer Liste, etc.).

In einer Klasse kann es beliebig viele Konstruktoren, aber nur einen (parameterlosen) Destruktor geben. Er hat den Prototyp

~ classname();
Wenn vom Benutzer kein eigener Destruktor definiert wird, wird vom Compiler ein Default-Destruktor benutzt, der lediglich die Datenmember destruiert.

Der Destruktor für unsere Vektor-Klasse sieht wie folgt aus:

class Vector { public: ~Vector() { delete[] v; } // ... };
Beim Matrix-Destruktor muß zunächst für jeden Zeilenvektor der Destruktor mit delete aufgerufen werden. Danach wird das Feld mit den Pointern vernichtet:
Matrix::~Matrix() { for (int i=0;i<rows;++i) delete pv[i]; delete[] pv; }

 
11.6: Copy-Konstruktoren II Startseite 12.1: Statische Datenmember 
 

© 1998 Axel Rogat