PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aufruf von Destuktoren in C++


Vedek Bareil
2002-12-09, 01:54:08
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 Analogie 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?

Exxtreme
2002-12-09, 01:58:54
AFAIK sind keine Destruktor-Aufrufe vorgesehen. Der Destruktor wird aufgerufen wenn das Objekt zerstört wird. Objekte werden zerstört wenn sie z.B.- lokal waren in einer Funktion und diese Funktion beendet wird, oder wenn diese Objekte per new-Anweisung dynamisch allokiert wurden on jetzt per free-Anweisung freigegeben werden.

Unregistered
2002-12-09, 02:40:38
malloc() und free() sollte man bei C++ durch die Operatoren 'new' und 'delete' ersetzen. Übergibt man 'delete' ein Objekt, dann wird - vor dem Freigeben des Speichers - auch sein Destruktor aufgerufen. Das dürfte dann das sein, was du suchst.

CObject *myObject = new CObject();
myObject->LightChristmasTree();
delete myObject;

zeckensack
2002-12-09, 06:30:43
Man kann trotzdem explizit den Destruktor aufrufen :)

Und zwar geht das tatsächlich mittels

Objekt.~Klassenname();

oder halt

Pointer->~Klassenname();

Daß du danach noch 'normal' auf das Objekt zugreifen kannst, liegt daran daß der Speicher nicht freigegeben wird, also unter Umständen (je nachdem was der Destruktor so macht) noch brauchbare Werte dort rumhängen.

Den Speicher freigeben muß man dann selbst, das ist ja auch der eigentliche Sinn der Übung.

Nützlich ist das ganze in Verbindung mit placement new (http://gethelp.devx.com/techtips/cpp_pro/10min/10min0999.asp) (Thx @ KiBa für den Tipp (http://www.forum-3dcenter.org/vbulletin/showthread.php?s=&threadid=24822)), um eine eigene Speicherverwaltung für Objekte durchzuziehen.

Einfachkrank
2002-12-09, 15:15:56
Hi,

sorry wenn ich gerade mal so dumm dazwischen funke, aber was isn en Destruktor? Klingt schon wieder so professionell :D

Exxtreme
2002-12-09, 15:21:23
Originally posted by Einfachkrank
Hi,

sorry wenn ich gerade mal so dumm dazwischen funke, aber was isn en Destruktor? Klingt schon wieder so professionell :D
Ein Destruktor ist das zielich genaue Gegenteil eines Konstruktors. Ein Destruktor wird dann aufgerufen wenn das betreffende Objekt zerstört wird. Man kann im Destruktor "Aufräumarbeiten" gut unterbringen wie allokierten Speicher freigeben usw.

Nasenbaer
2002-12-09, 15:36:48
Originally posted by Exxtreme
[..] wie allokierten Speicher freigeben usw.

Ich liebe auch die Anglizismen. :)

Was geschieht eigentlich mit Objekten die innerhalb eines gesamten Modules sichtbar sind? Wann verlässt man deren Sichtbarkeitsbereich, d.h. wann werden die zerstört?

Mfg Nasenbaer

Demirug
2002-12-09, 15:44:45
Originally posted by Nasenbaer

Was geschieht eigentlich mit Objekten die innerhalb eines gesamten Modules sichtbar sind? Wann verlässt man deren Sichtbarkeitsbereich, d.h. wann werden die zerstört?

Mfg Nasenbaer

Du meist globale Objekte?

Diese werden nach dem verlassen der Hauptfunktion (main bzw WinMain) zerstört und dabei wird auch der Deskturktor aufgerufen.

Nasenbaer
2002-12-09, 15:47:49
Originally posted by Demirug
Du meist globale Objekte?


Jo meint ich. :)
MFg Nasenbaer

micki
2002-12-11, 09:32:14
eigentlich sind destructoren nicht dafür da speicher freizugeben, sondern nur um das object zu bereinigen damit der speicher indem das object ist freigegeben werden kann.
und wie zeckensack scho gesagt hat, man kann die destructoren direct aufrufen, das muss man sogar, wenn man es mit einem in placement new erstellt hat.
das muss man wiederum machen, wenn man eine member im object haben möchte die keinen default konstructor hat und deswegen nachträglich in ein array von z.B. char m_Buffer[sizeof(CSecondWindow)];
eingefügt wird, weil vorher keine initialisierungswerte vorhanden sind.

MfG
micki

zeckensack
2002-12-11, 10:21:47
Originally posted by micki
eigentlich sind destructoren nicht dafür da speicher freizugeben, sondern nur um das object zu bereinigen damit der speicher indem das object ist freigegeben werden kann.
und wie zeckensack scho gesagt hat, man kann die destructoren direct aufrufen, das muss man sogar, wenn man es mit einem in placement new erstellt hat.
das muss man wiederum machen, wenn man eine member im object haben möchte die keinen default konstructor hat und deswegen nachträglich in ein array von z.B. char m_Buffer[sizeof(CSecondWindow)];
eingefügt wird, weil vorher keine initialisierungswerte vorhanden sind.

MfG
micki Ich weiß zwar nicht, was du mit dem Array meinst :|
aber dem vom mir eingefetteten Satz muß ich widersprechen ;)

Nutze die Präambel, Luke :)

Ieclass
NoDefault
{
public:
NoDefault(int x);
private:
NoDefault();
int x;
};

class
ArmerWicht
{
public:
ArmerWicht();
private:
NoDefault plops;
};

NoDefault::Nodefault(int x):
x(x)
{
}

ArmerWicht::ArmerWicht():
plops(17)
{
}

Sollte klappen ...