Du bist nicht angemeldet.

Werbeanzeige

1

03.06.2010, 16:24

Wann wird der Destructor aufgerufen?

Ich hoffe ich werde nun nicht gesteinigt, aber ich frage mich grad, wann der Destructor einer Klasse aufgerufen wird. Wenn ich ein Objekt mit new erstelle, und ihn mit delete lösche, wird der Destructor aufgerufen, das ist mir schon klar, aber wie ist es, wenn dieses Objekt ohne new erstellt wird.

Beispielsweise ich erstelle ein Objekt in einer Funktion, und wenn die Funktion fertig ist, und das Programm wieder aus der Funktion raus springt, wird dann das Obekt selbst nur geslöscht, oder auch der Destructor aufgerufen?

Und wie ist es mit Vererbungen. Wenn ich eine Klasse hab die von einer anderen Erbt, und diese dann lösche, wird dann auch gleich der Destructor beider Klassen ausgeführt?

*Ich glaub ich steinige mich gleich selbst*

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

03.06.2010, 16:27

da der destuktor das objekt zerstört wird er aufgerufen.
immer bei delete, beim verlassen des gültigkeitsbereich oder wenn es ein objekt eines objekts ist das zerstört wird.

wenn du den destruktor der basisklasse als virtual deklarierst(was man unbedingt tun sollte) werden alle destruktoren aufgerufen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 520

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

03.06.2010, 17:36

Ein automatisches Objekt wird zerstört sobald sein Gültigkeitsbereich verlassen wird. Das hast NachoMan bereits korrekt gesagt.
Wenn du in einer Funktion ein automatisches Objekt erstellst, dann wird das beim verlassen der Funktion zerstört (sei es normal oder mit einer Exception). Wenn du ein Objekt in einer Klasse deklarierst, wird es im Destruktor dieser Klasse zerstört. Globale und statische Objekte werden am Ende der main zerstört. Du kannst diese Frage also einfach auf den Gültigkeitsbereich zurückführen.

BlackSnake

Community-Fossil

Beiträge: 1 554

Beruf: Student

  • Private Nachricht senden

4

03.06.2010, 18:20

"wenn du den destruktor der basisklasse als virtual deklarierst(was man unbedingt tun sollte) werden alle destruktoren aufgerufen."
meiner meinung nach, muss man genau dies nicht tun. das erzeugt nen dicken "overhead" (kp, wie ich das jetzt am besten nennen soll), wenn man unnötige sachen als virtual deklariert.
man muss den destructor des basisklasse nur als virtual deklarieren, wenn man über diese basisklasse auch löschen möchte, ansonsten wären das verschwendete resourcen....

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

03.06.2010, 19:15

die regel die ich in mehreren büchern gelesen habe und die auch sinnvoll ist lautet: "wenn nur eine methode einer klasse als virtual deklariert ist sollte auch als virtual deklariert werden"
ich hab mich auf die frage bezogen die ich leider nicht genau gelesen hab^^

fazit: wird eine abgeleitete klasse zerstört, werden immer beide destruktoren aufgerufen.
löscht man eine abgeleitete klasse über einen basisklassenzeiger muss der destruktor als virtual deklariert sein damit beide ausgeführt werden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlackSnake

Community-Fossil

Beiträge: 1 554

Beruf: Student

  • Private Nachricht senden

6

03.06.2010, 20:11

dann sind wir uns ja einig :)
und nu -> back to topic ^^

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

03.06.2010, 21:03

hab ich was verpasst? das war topic xD
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

8

03.06.2010, 21:22

Ich ziehe gutes Design vor! Wenn man wirklich jeden Overhead zu vermeiden versucht, endet dies 100%ig in einem Chaotischen Code bzw in einen sehr Fehleranfälligen Code. Theoretisch dürfte man dann ja keine Interfaces mehr nutzen ...

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

BlackSnake

Community-Fossil

Beiträge: 1 554

Beruf: Student

  • Private Nachricht senden

9

03.06.2010, 22:14

jagut, hast recht, war doch schon irgendwie topic, streich das also :)

10

04.06.2010, 14:26

Ich ziehe gutes Design vor! Wenn man wirklich jeden Overhead zu vermeiden versucht, endet dies 100%ig in einem Chaotischen Code bzw in einen sehr Fehleranfälligen Code.
Es hat auch mit gutem Design zu tun, sich genau zu überlegen, ob eine Klasse polymorph eingesetzt wird oder nicht. Präventiv virtual einsetzen, sobald eine Klasse in einer Vererbungshierarchie steht, ist sinnlos und wie alle Designfehler potentiell gefährlich.

Theoretisch dürfte man dann ja keine Interfaces mehr nutzen ...
Du musst das schon differenziert sehen. Wenn du die Funktionalität zur impliziten Typunterscheidung brauchst, kommst du nicht um ein virtual herum. Du kannst dir zwar eines mit if, switch oder Funktionszeigern nachbauen, aber das ist wahrscheinlich noch weniger performant und zudem schlechter wartbar. Wenn du hingegen keines brauchst und auch in naher Zukunft keines brauchen wirst, schreibst du auch keines hin.

Werbeanzeige