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