Archiv verlassen und diese Seite im Standarddesign anzeigen : Was passiert hier?
Mal rein theoretisch:
ich lege eine Objektinstanz dynamisch mit "new" an, erhalte einen Zeiger. Nun erstelle ich eine Referenz auf diese Instanz mit
CBlubbObject &cReferenz = *pInstanz;
Was passiert nun, wenn ich die Instanz mit delete pInstanz; lösche? Kann ich danach noch über die Referenz auf das Objekt zugreifen? Oder führt das unweigerlich zum Absturz?
Danke
Grüße,
Hendrik
Der Mensch, der seine Fragen selbst beantwortet... hey, es ist Mo... Mittwoch Morgen *gäääähn*
Nach einem kleinen Test in der Form:
#include <stdio.h>
#include <stdlib.h>
class CTest
{
public:
CTest() {}
~CTest() {}
public:
void Msg()
{
printf("Hallo Welt\n");
}
};
int main(void)
{
CTest* pTest = new CTest;
CTest& cReferenz = *pTest;
printf("Zeiger...\n");
pTest->Msg();
printf("Referenz...\n");
cReferenz.Msg();
delete pTest;
printf("Gelöscht...\n");
cReferenz.Msg();
}
stellte sich heraus, daß ich tatsächlich noch auf das Objekt zugreifen kann. Aber... wie lange geht das gut? Ist der Speicher noch vom Programm reserviert, solange die Referenz existiert? Oder ist der Speicher freigegeben und nur noch verwendbar, weil noch niemand drüber gekliert hat?
Danke.
Grüße,
Hendrik
locus vivendi
04-10-2006, 12:16
ich lege eine Objektinstanz dynamisch mit "new" an, erhalte einen Zeiger. Nun erstelle ich eine Referenz auf diese Instanz mit
Code:
CBlubbObject &cReferenz = *pInstanz;
Was passiert nun, wenn ich die Instanz mit delete pInstanz; lösche? Kann ich danach noch über die Referenz auf das Objekt zugreifen? Oder führt das unweigerlich zum Absturz?
Die Antwort auf die die letzten beiden Fragen lautetet "weder noch". Wenn das geschieht ist das Verhalten deines Programms von C++ nicht mehr definiert. Der C++-Implementierung wäre es erlaubt den Speicher solange Vorrätig zu halten bis er nicht mehr gebraucht wird, dann würde dein Programm möglicherweise nicht abstürzen. Die Implementierung könnte auch das Objekt als Zombie markieren und beim Zugriff das Programm unweigerlich terminieren. Aber du kannst dich halt nicht darauf verlassen wenn du portable Programme schreiben willst.
[...]stellte sich heraus, daß ich tatsächlich noch auf das Objekt zugreifen kann. Aber... wie lange geht das gut? Ist der Speicher noch vom Programm reserviert, solange die Referenz existiert? Oder ist der Speicher freigegeben und nur noch verwendbar, weil noch niemand drüber gekliert hat?
Siehe oben: Auf diese Fragen gibt es keine eindeutigen Antworten. Aber ich möchte mal anmerken das du einmal von "Objekt" sprichst und dann von "Speicher", so als ob das dasgleiche wäre. Das ist es aber nicht. In C++ kann ein Objekt aufhören zu existieren obwohl von ihm verwendeter Speicher noch brauchbar ist.
der Speichermanager der c++ runtime kann dein speicher auch "freigeben", nur das BS ist zu faul da irgendwas scho drueberzubuegeln .... und wartet auf bisserl mehr, oder das es swappen muss ....
wenn du es packst, das andere programme ihre wichtigen "Daten" in genau dem grade freigeworden speicherbereich deponieren ... kann dein zeiger ploetzlich gold wert sein ^^
Aber daran woll wir lieber nicht weiter denken ...
Ciao ...
Hmm... Zwei Dinge noch dazu:
1. Das Programm soll nicht zwingend plattformübergreifend lauffähig sein, da es sich um eines der Art handelt, die per Definition nur auf einem bestimmten Systemtyp laufen. Pseudo-Embedded, nicht für den Massenmarkt brauchbar.
2. Ich verwende den GNU GCC zum Übersetzen.
Ändert das irgendwas an euren Ausführungen?
anda_skoa
11-10-2006, 10:59
Ändert das irgendwas an euren Ausführungen?
Nein.
Du kannst immer nur unter der Annahme arbeiten, daß ein gelöschtes Objekt nicht mehr da ist.
Alles andere ist russisches Roulette
Ciao,
_
zu deutsch:
Du kannst nie checken, ob dein objekt geloescht wurde oder nicht (anhand der ueberpruefung des inhalts) ... sondern die logic deines programmes muss das sicherstellen.
Es ist nicht definiert, was mit freigegebenen speicher passiert .... das haengt von 25000 und mehr bedingungen ab ^^
Ciao ...
Für solche Sachen bieten sich Tools wie valgrind oder electric fence an. Die brechen das Programm ab, sobald du auf freigegebenen Speicher zugreifst.
Electric Fence, das sehe ich gerade, wurde durch DUMA abgelöst. Sofern ich das richtig verstanden habe... ich schau's mir gerade an.
Edit: Entweder ich bin zu doof, oder DUMA ist kaputt. Naja... Mal sehen, was Valgrind sagt...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.