Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Wie benutzt man Destruktoren (in C++)?
Gehe zu Seite 1, 2, 3  Weiter
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> Wie benutzt man Destruktoren (in C++)?
 
Autor Nachricht
ichbinsisyphos
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 31.05.2007
Beiträge: 1700

BeitragVerfasst am: 08 Okt 2009 - 00:28:23    Titel: Wie benutzt man Destruktoren (in C++)?

Mir ist grad was aufgefallen, ich lern zwar immer wieder wie man Konstruktoren und Destruktoren definiert, aber nicht wie man ein Objekt damit dann auch zerstören kann.

Zufälligerweise bin ich grad das erste Mal auf einen Fall gestoßen, bei dem ich Destruktoren tatsächlich sinnvoll einsetzen kann (Anzahl der erzeugten Objekte wird in einer statischen Variable notiert, mit Konstruktor um 1 erhöht, mit Destruktor um 1 verringert).

Also, wie mach ich das?
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 08 Okt 2009 - 08:54:06    Titel:

Genauso, wie du einen Konstruktor nicht nicht aufrufen kannst (bei der Erstellung eines Objektes) kannst du einen Destruktor nicht explizit aufrufen, sondern er wird intern aufgerufen, wenn das zugehörige Objekt zerstört wird. Siehe z.B. hier (unteres Beispiel):

http://tutorial.schornboeck.net/staticmember.htm
ichbinsisyphos
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 31.05.2007
Beiträge: 1700

BeitragVerfasst am: 08 Okt 2009 - 18:52:20    Titel:

Ja aber die Frage war, wie ich ein Objekt zerstören kann. In dem Beispiel werden die Objekte am Ende des {}-Blocks nicht mehr gebraucht nehm ich an. Aber kann man das auch explizit machen?
just_phil
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 23.08.2008
Beiträge: 1006

BeitragVerfasst am: 08 Okt 2009 - 19:04:08    Titel:

Nein, darum kümmert sich glücklicherweise das Speichermanagment. Smile Genau wie Variablen von primitiven Datentypen "sterben", sobald ihr Gültigkeitsbereich sein Ende findet, werden auch Objekte in dem Fall weggeputzt.

Auch, wenn du per "delete" den Speicher eines dynamisch auf dem Heap erstellten Objektes freigibst (und dafür bist wiederum Du verantwortlich), wird intern auch ein Aufruf des Destruktors des Objektes getätigt, selbst aufrufen kannst Du ihn aber auch dort nicht.
Annihilator
Valued Contributor
Benutzer-Profile anzeigen
Valued Contributor


Anmeldungsdatum: 18.05.2007
Beiträge: 6394
Wohnort: (hier nicht mehr aktiv)

BeitragVerfasst am: 08 Okt 2009 - 19:59:12    Titel:

Um mal etwas konkreter auf die Frage einzugehen, wie man den Destruktor denn nun "manuell" einsetzen kann:

Code:

#include <stdio.h>

class Beispiel
{
   public: Beispiel() {printf("Konstruktor aufgerufen\n");}
   public: ~Beispiel() {printf("Destruktor aufgerufen\n");}
};

int main()
{
   Beispiel* bz = new Beispiel(); // Hier ruft C++ den Konstruktor auf
   /*
      Mach hier mit der dynamischen Variable (ihr Wert ist *bz), was du willst
   */
   delete bz; // Hier ruft C++ den Destruktor auf
   /*
      Hier ist sie nicht mehr dereferenzierbar
   */
   return 0;
}
ichbinsisyphos
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 31.05.2007
Beiträge: 1700

BeitragVerfasst am: 08 Okt 2009 - 20:14:50    Titel:

Zitat:
... selbst aufrufen kannst Du ihn aber auch dort nicht ...
Nur als exemplarisches Beispiel. Ich hatte überhaupt nicht vor, den Destruktor aufzurufen, sondern ihn halt für was sinnvolles zu nutzen. Dazu brauchte ich einen Weg ein Objekt zu zerstören.


delete hab ich schon probiert, das gibt komischerweise immer einen segmentation fault.
Ich kann delete auch nicht im Destruktor verwenden, um die Attribute freizugeben.


edit: Aso, warte mal, bz muss ein Pointer auf das Objekt sein?

Welchen Sinn hat eigentlich "new"? Ist das unentbehrlich?
Annihilator
Valued Contributor
Benutzer-Profile anzeigen
Valued Contributor


Anmeldungsdatum: 18.05.2007
Beiträge: 6394
Wohnort: (hier nicht mehr aktiv)

BeitragVerfasst am: 08 Okt 2009 - 20:57:48    Titel:

Ahhhhh! Vorsichtig! delete löscht ein dynamisches Objekt (gibt den Speicherplatz wieder frei, etc.) und ruft dabei den Desktruktor des betreffenden Objekts auf. Es wird keinesfalls dazu verwendet, gewöhnliche Variablen "wegzuwerfen". Lies dich mal in das Thema Zeiger und dynamische Speicherverwaltung ein!

EDIT: new erstellt ein neues dynamisches Objekt und gibt den Zeiger auf dieses zurück. Dabei wird eben ein Konstruktor der Klasse verwendet.
just_phil
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 23.08.2008
Beiträge: 1006

BeitragVerfasst am: 08 Okt 2009 - 21:01:03    Titel:

Ich glaube, es ist am besten, wenn Du den entsprechenden Codeausschnitt mal postest, wo Du den Segmentation Fault erhälst, dann kann man Dir wahrscheinlich besser helfen.

Die Zerstörung eines Objektes wird jedenfalls nur im dynamisch erstellten Fall durch delete angestoßen, ansonsten kommt es eben auf den Gültigkeitsbereich an, bis ein Objekt automatisch zerstört wird.

Und wenn Du zwingend was "machen" willst, dann geht es eben so, wie Annihilator das schon gezeigt hat (in diesem Fall wohlgemerkt dynamisch):

Code:
Beispiel* beispiel = new Beispiel();
...
delete beispiel;


Das delete ruft den Destruktor auf, in dem Du dann die statische Zählvariable um eins dekrementieren musst. Im Konstruktor eben das Gegenteil.

EDIT: OK, jetzt scheint sich das wahre Problem aufzutun. Smile
ichbinsisyphos
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 31.05.2007
Beiträge: 1700

BeitragVerfasst am: 08 Okt 2009 - 21:16:40    Titel:

Und es ist auch nicht sinnvoll, Variablen in Destruktoren freizugeben (wenn es eine Möglichkeit gäbe, k.A.), die sterben sowieso in jedem Fall mit?
Nur die dynamischen sollten händisch gelöscht werden?

Ich hatte ein Beispiel-Programm in dem ein constant char-array im Destruktor explizit gelöscht wurde, ich dachte, dass sollt man vielleicht für alles machen.
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 08 Okt 2009 - 21:31:11    Titel:

ichbinsisyphos hat folgendes geschrieben:
Und es ist auch nicht sinnvoll, Variablen in Destruktoren freizugeben (wenn es eine Möglichkeit gäbe, k.A.), die sterben sowieso in jedem Fall mit?
Nur die dynamischen sollten händisch gelöscht werden?


Richtig. Jeglicher dynamisch allokierter Speicher muss manuell wieder freigegeben werden, ansonsten ist er bis zu einer Aufräumaktion o.ä. des Betriebssystems nicht mehr benutzbar (weil augenscheinlich in Benutzung o.ä.).
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> Wie benutzt man Destruktoren (in C++)?
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum