Der Destruktor (``es kann nur einen geben'') einer Klasse X
heißt ~X
. Er wird jedesmal aufgerufen, wenn ein Objekt der
Klasse X gelöscht wird:
Der Destruktor hat keinen Ergebnistyp und keine Parameter.
Beispiel:
class string { char *s; public: string(char *p) : s(p) { cout << "create " << s << "\n";} ~string() {cout << "destroy " << s << "\n";} }; string g("global"); int main() { string s1("hans"); string s2("otto"); } /* main */
erzeugt die Ausgabe
create global create hans create otto destroy otto destroy hans destroy global
Destruktoren werden zum Freigeben dynamisch allokierten Speichers verwendet:
class string { char *s; public: string(char *p) { s = new char[strlen(p)+1]; strcpy(s,p); cout << "create " << s << "\n";} ~string() { cout << "destroy " << s << "\n"; delete [] s; } };
Bei fehlenden Benutzer-definierten Copy-Konstruktoren kann es Probleme geben:
int main() { string s1("Hans"); string s2=s1; } /* main */
erzeugt folgende Ausgabe:
create Hans destroy Hans destroy Hans // "Hans" ist schon freigegeben