dangling pointer
-
Hallo an alle.
Weiß jemand zufälligerweise, wie man überprüfen kann, ob ein pointer gültig ist oder nicht?void foo() { void* p = new int(); delete p; // p nicht auf NULL setzen // p ist ab hier nicht mehr gültig }wenn ich im oberen beispiel p = 0 setze ist alles in ordnung, da man ihn ja auf 0 prüfen kann.
Kann man überhaupt im standard C++ solche Überprüfungen machen, ob das ding ungültig ist, wenn ich beispielsweise irgendwo später auf diesen zugreifen möchte?Danke in voraus
Grüße
Dimitrij
-
Nein, eine solche Überprüfung ist meines Wissens nach nicht möglich.
-
Nein kannst Du nicht.
Aber das Ding auf 0 zu setzen sollte nicht das Problem sein oder?

-
Aber das Ding auf 0 zu setzen sollte nicht das Problem sein oder?
Das nicht.
Ich habe mir eine kleine hilfklasse geschrieben, die wie die auto_ptr funzt, nur zusätzlich noch runtime exceptions schmeißt, wenn irgendwelche speicherprobleme auftreten. Bsp. wenn mann auf einem null pointer zugreift oder ähnlich. Das einzige was ihr momentan noch fehlt, ist halt solche überprüfung.Beispiel wäre:
void foo() { mem<Object> ptr_o = new Object(); ptr_o->fooAufObjectKlasse(); // in der Art. // mache ich abe so was: ptr_o = NULL; ptr_o->fooAufObjectKlasse(); // hier wird eine exception geschmissen. //NullPointer - wie in java :) // würde ich abe irgendwie sowas machen: vorausgesetzt ptr_o hält noch einen // gültigen zeiger delete ptr_o.ptr(); // Jetzt hält ptr_o einen ungültigen zeiger auf Object // wenn ich jetzt aufrufe ptr_o->fooAufObjectKlasse(); // dann wird keine meiner exceptions geschmissen, sondern abgekackt, da der // innere pointer nicht gültig ist. :( }
-
Wenn es nur darum geht das für Speicherbereiche zu überprüfen, die garantiert irgendwann mal Dir gehört haben, könntest Du den globalen op delete überschreiben und alle Adressen, die Du irgendwann mal gelöscht hast in eine Liste packen (aber bitte nur zur Debug-Time
) und diese dann beim Zugriff durchsuchen.Von der Sprache her direkt ist das nicht möglich, nicht umsonst haben Speicherdebugger immer irgendwelche Performance-Nachteile (weil sie eben in Listen schauen müssen oder sich div. anderer Tricks bedienen). Electric Fence (Linux) zum Beispiel schützt Speicherbereiche die mal benutzt wurden sowie die Bereiche davor und dahinter durch Invalid Pages.
-
Frage wäre an dieser Stelle, was dann passiert, wenn zufälligerweise derselbe speicherbereich wieder für etwas anderes gültig wird?
Und abgesehen davon wird es mir dann zu langsam.
Danke aber trotzdem für den tip
-
dadrus schrieb:
void foo() { void* p = new int(); delete p; // p nicht auf NULL setzen // p ist ab hier nicht mehr gültig }das ist in jedem falle undefiniertes verhalten. delete auf einen void* zeiger ist unzulässig (und unsinnig, es gibt ja auch kein new void)