Der Martin: C++ Wie Dekonstruktor einsetzen?

Beitrag lesen

Hallo Markus,

Bei der oo Programmierung in C++ ist mir die Verwendung des Dekonstruktors nicht ganz klar.

"Destruktor", nicht "Dekonstruktor".

So weit ich weiß, soll der Dekonstruktor die selbe Aufgabe des Garbage Collectors in Java haben, also die unreferenzierten Instanzen aus dem Speicher zu entfernen.

Hm, wenn das so in einem Progrmmierbuch steht, sollte der Autor seine Formulierung nochmal überdenken.
Packen wir's von der anderen Seite an: Ein Objekt (also eine Instanz einer Klasse) erzeugen wir in C++ mit
 obj = new Cls(...);
wobei Cls der Klassenname ist und obj die damit erzeugte Instanz. Dadurch wird ein neues Objekt der entsprechenden Klasse im Speicher angelegt, und der Konstruktor dieser Klasse wird aufgerufen. Der Konstruktor kann durchaus eine leere Funktion sein, wenn das Objekt weiter keine Initialisierung braucht; andernfalls empfiehlt es sich, im Konstruktor die internen Objektvariablen mit sinnvollen Werten zu belegen. Je nach Aufgabe des Objekt ist es sinnvoll, hier weitere Schritte zu unternehmen. Wenn das Objekt beispielsweise mit einer Datei verknüpft ist, die damit bearbeitet werden kann, dann würde ich im Konstruktor auch noch diese Datei öffnen.

Nur ist mir hierbei nicht klar, ob die Speicherfreigabe "automatisch" vom Programm verwendet wird, ermöglicht durch die bloße Tatsache des vorhandenen Dekonstruktors, oder ob ich explizit noch irgendwelchen Code schreiben muss.

"Das kommt drauf an". ;-)
Ein Objekt wird in C++ mit
 delete obj;
wieder gelöscht. Dabei wird erst der Destruktor des Objekts aufgerufen (wenn er existiert), und dann der Speicherplatz, den die objekteigenen Variablen belegen, automatisch wieder ordnungsgemäß freigegeben.
Jetzt musst du halt selbst überlegen, ob dein Objekt während seiner "Lebenszeit" etwas gemacht hat, was man beim Beseitigen wieder in Ordnung bringen sollte. Bei meinem obigen Beispiel mit dem Objekt zur Dateimanipulation habe ich im Konstruktor die Datei geöffnet - der logische Schluss wäre also, im Destruktor die Datei wieder ordnungsgemäß zu schließen.

Falls es automatisch geschieht, wie ich meine, frage ich mich, was denn nun in der obrigen Funktion eigentlich drinstehen muss?

Kurz gesagt: All das, was der Konstruktor oder andere Methoden angefangen haben, sollte im Destruktor wieder in Ordnung gebracht werden. Nur das Freigeben des Arbeitsspeichers, den das Objekt belegt, erfolgt automatisch.

Schönes Wochenende noch,
 Martin

--
F: Was ist schlimmer: Alzheimer oder Parkinson?
A: Parkinson. Lieber mal ein Bier vergessen zu zahlen, als eins verschütten.