Instanz exestiert nach Aufruf des Destruktors immer noch!
-
Erhard Henkes schrieb:
Gibt es da wirklich keine Möglichkeit zu unterscheiden, ob ein Objekt "lebendig" oder nur noch ein "Zombie" ist?
nein, wozu auch?
es gibt in C++ keine Zombie-Objekte
den dtor darf man nur im zusammenhang mit placement new aufrufen.
-
"es gibt in C++ keine Zombie-Objekte."
In der Theorie vielleicht nein, in der Praxis aber wohl (s.o.).
Wir haben hier bisher vor allem über Objekte auf dem Stack (also ohne new erzeugt) gesprochen, nicht auf dem heap. Die kann man durch einen "destructor praecox" in so eine Art "zombies" verwandeln. Nun geht es um die Detektion dieser Objektspezies. Ein lustiges Thema.
-
wo ist da n zombie objekt?
donald.~dog();
darfst du eingach nicht machen - hoechstens um nachher ein placement new anzubringen - aber selbst da wuerde ich stark an dem programmierer zweifeln.es ist zwar moeglich ein objekt zum zombie zu machen - doch wer das tut ist selber schuld - denn es ist nicht vorgesehen.
-
Definiere Zombie.
Wir haben hier bisher vor allem über Objekte auf dem Stack (also ohne new erzeugt) gesprochen, nicht auf dem heap. Die kann man durch einen "destructor praecox" in so eine Art "zombies" verwandeln. Nun geht es um die Detektion dieser Objektspezies. Ein lustiges Thema
Laut C++ Lebenszyklus-Modell existiert mit Betreten des Destruktors kein Objekt mehr. Es existiert nur noch ein haufen toter Bits. Keine Ahnung ob das deiner Definition von Zombie gleichkommt. Erkennen kannst du diese Objektspezie freilich nicht, da hier keine Objekte mehr existieren.
Daran würde übrigens auch das Ausnullen des Speichers nichts ändern.Man darf nicht den Namen eines Objekts (den genauen Standard-Begriff weiß ich im Moment nicht) oder die Referenzen auf ein Objekt mit dem Objekt selbst verwechseln. Der Destruktor zerstört ein Objekt. Der Name verliert mit dem Ende des Scopes seine Gültigkeit. Das eine hat mit dem anderen aber nicht direkt etwas zu tun.
Bei auto-Objekten fällt beides im Normalfall zusammen. Mit Scope-Ende verschwindet also der Name und es wird der Dtor des Objekts aufgerufen.Wenn du vorher selbst den Dtor aufrufst, existiert wie gesagt kein Objekt mehr. Der Name referenziert danach kein Objekt, sondern toten Speicher.
Wie auch immer. Für solche Sachen braucht man keine Objekte im C++-OOP-Sinne. Das geht genauso gut mit C und Zeigern.
-
Wie kann man unterscheiden, ob ein "Name" (ist ja ein zeiger) ein gültiges Objekt oder einen toten Bithaufen, der nur noch ein ungültiges Abbild des Objektes ist, adressiert?
-
Wie kann man unterscheiden, ob ein "Name" (ist ja ein zeiger) ein gültiges Objekt oder einen toten Bithaufen, der nur noch ein ungültiges Abbild des Objektes ist, adressiert?
Gar nicht. Wie ich oben bereits schrieb.
-
Thomas Strasser, C++ Programmieren mit Stil, 2. Auflage, 2003, S.187:
"Elementfunktionen, die automatisch aufgerufen werden (wie etwa Konstruktor, Destruktor etc.), sollten nicht von Hand aus aufgerufen werden."Thomas Strasser, C++ Programmieren mit Stil, 2. Auflage, 2003, S.196:
"Konstruktoren und Destruktoren sind Initialiserungs- bzw. De-Initialiserungsfunktionen. Sie sind nicht verantwortlich für das Anlegen bzw. Freigeben des Objekts selbst bzw. dessen Instanzvariablen. Das wird vom C++-System übernommen."
-
"Konstruktoren und Destruktoren sind Initialiserungs- bzw. De-Initialiserungsfunktionen. Sie sind nicht verantwortlich für das Anlegen bzw. Freigeben des Objekts selbst bzw. dessen Instanzvariablen. Das wird vom C++-System übernommen."
Besser: Sie sind nicht verantwortlich für das Anlegen bzw. Freigeben des vom Objekt verwendeten Speichers. Das wird vom operator new bzw. operator delete erledigt.
-
new/delete gilt für Objekte auf dem Heap. Es gibt aber auch Objekte auf dem Stack oder im globalen Speicher (oder sonst wo).
-
Erhard Henkes schrieb:
new/delete gilt für Objekte auf dem Heap. Es gibt aber auch Objekte auf dem Stack oder im globalen Speicher (oder sonst wo).
ja, aber das system ist das gleiche.
{
int i; //i wird allokiert
} //i wird deallokiertdeswegen auch meine beispiele mit new - denn der mechanismus ist der gleiche.
-
Ich verstehe die ganze Aufregung gar nicht. Es ist doch ganz klar, daß es Zombies geben kann, man könnte die wohl auch durch ein hartes Zeigercasting wieder reaktivieren (allerdings mit den bei Zombies üblichen Nebenwirkungen - holt schon mal ein Kreuz).
Und der Unterschied zwischen Zombies auf dem Stack und auf dem Heap ist doch auch sonnenklar.
Aber das liegt an der technischen Grundlage der Speicherverwaltung von C++ und dem OS. Und es stellt keine wie auch immer geartete Einschränkung für den Entwickler dar.
Ich sehe ein, daß jemand beim ersten Mal verwundert ist, aber wieso kann dieser Thread so viele Beiträge bekommen?