Aufruf von Destuktoren in C++
-
Wie kann man eigentlich in C++ einen Destruktor aufrufen? In Delphi geht das ja mit Objektname.Destroy oder Objektname.Free, aber wie lautet die entsprechende Anweisung in C++?
Der Name des Destruktors ist ja ~Klassenname(), und in Analorgie zu Delphi könnte man ja auf die Idee kommen, der Aufruf sei Objektname.~Klassenname(), aber das scheint nicht der Fall zu sein, hab ich mal ausprobiert und konnte hinterher immer noch auf das Objekt zugreifen.
In allen Beispielprogrammen, die ich bisher gesehen habe, werden Destruktoren überhaupt nicht explizit aufgerufen, sondern nur automatisch, wenn z.B. ein Objekt lokal in einer Funktion erzeugt wurde und das Ende der Funktion erreicht ist.
Sind explizite Destruktoraufrufe in C++ vielleicht gar nicht vorgesehen?
-
Vedek schrieb:
Sind explizite Destruktoraufrufe in C++ vielleicht gar nicht vorgesehen?
Richtig.
Vedek schrieb:
und in Analorgie zu Delphi
lol

-
this->that schrieb:
Vedek schrieb:
Sind explizite Destruktoraufrufe in C++ vielleicht gar nicht vorgesehen?
Richtig.
Falsch. Die sind sehr wohl vorgesehen. Musst du z.B. machen, wenn du einen eigenen operator delete definierst. obj.~Object() ist korrekt.
-
hansi2 schrieb:
this->that schrieb:
Vedek schrieb:
Sind explizite Destruktoraufrufe in C++ vielleicht gar nicht vorgesehen?
Richtig.
Falsch. Die sind sehr wohl vorgesehen. Musst du z.B. machen, wenn du einen eigenen operator delete definierst. obj.~Object() ist korrekt.
Die Frage lautet, ob ein expliziter Aufruf vorgesehen ist und das ist klar zu verneinen. Sonst würden sie ja nicht automatisch beim Verlassen des Scopes aufgerufen werden.
-
this->that schrieb:
hansi2 schrieb:
this->that schrieb:
Vedek schrieb:
Sind explizite Destruktoraufrufe in C++ vielleicht gar nicht vorgesehen?
Richtig.
Falsch. Die sind sehr wohl vorgesehen. Musst du z.B. machen, wenn du einen eigenen operator delete definierst. obj.~Object() ist korrekt.
Die Frage lautet, ob ein expliziter Aufruf vorgesehen ist und das ist klar zu verneinen. Sonst würden sie ja nicht automatisch beim Verlassen des Scopes aufgerufen werden.
Netter Versuch, dich herauszureden! Gib doch einfach zu, dass du noch nie was von operator new und operator delete gehört hast! Ha ha ha!
-
Hi,
sorry wenn ich gerade mal so dumm dazwischen funke, aber was isn en Destruktor?

Klingt schon wieder so professionell
-
das gegenteil vom Konstruktor
-
Vedek schrieb:
Der Name des Destruktors ist ja ~Klassenname(), und in Analorgie zu Delphi könnte man ja auf die Idee kommen, der Aufruf sei Objektname.~Klassenname(), aber das scheint nicht der Fall zu sein, hab ich mal ausprobiert und konnte hinterher immer noch auf das Objekt zugreifen.
Weil das Object so auch nicht gelöscht wird, sonder nur ein paar member. Aber auch wenn du ein Objekt mit delete löscht, kannst du in C++ immer noch darauf zugreifen, das Verhalten ist nur undefiniert.
-
Ein Löschen im eigentlichen Sinn gibt es nicht. Ein C++ Objekt darf nach der Destruktion nicht mehr benutzt werden, obwohl es tatsächlich noch eine unbestimmte Zeit existiert. Manchmal wünsche ich mir einen Garbage Collector wie in Java. Das würde vieles leichter machen.
-
c++fan 2008 schrieb:
Manchmal wünsche ich mir einen Garbage Collector wie in Java. Das würde vieles leichter machen.
Und einiges schwerer. z.B. RAII mit einem Garbage-Collector ist etwas knifflig

-
Zudem hast du in C++ die Möglichkeit, Smart Pointer zu nutzen, die helfen dir auch beim automatischen Aufräumen.