Überprüfen ob Objekt von Pointer verfügbar
-
Hallo!
Ich hätte da eine Frage: Ist es möglich, zu überprüfen ob ein Objekt, auf das ein bestimmter Pointer zeigt verfügbar ist?
Ich habe nähmlich bei meiner Anwendung das Poblem, dass es passieren kann, dass per Pointer auf ein Objekt zugegriffen wird, was bereits zerstört wurde.Danke schon einmal im Vorraus.
MfG
Florian
-
nach dem Löschen den Zeiger sofort auf NULL setzten.
Dann kann man im weiteren verlauf testen, ob Zeiger NULL ist.
Andere Möglichkeit gibt's denk ich ned.
-
Hem, also mir fällt da so nichts ein. Ich würde eher versuchen zu verhindern, das dein Problem auftritt. Du müsstest dein Design vielleicht mal ändern, und anstatt vielleicht Pointer hin und her zu schieben bzw. zu übergeben, lieber mit Referenzen arbeiten? Einfach einen Pointer dereferenzieren und dann mit der Referenz weiter arbeiten.
Ansonst kannst du natürlich auch mal std::auto_ptr benutzen, denn genau damit passiert dir das nicht. Weil immer nur einer das Objekt besitzten kann, ist aber nicht für Container geeignet. Schau mal auf meine Homepage, da hab ich was dazu geschrieben.
Und wenn du Boost hast, kannst du auch shared_ptr benutzen, dann wird der Pointer für dich verwaltet, weil die Besitzer des Objekts gezählt werden und wenn der letzte das Objekt nicht mehr braucht, wird es autom. auf null gesetzt. shared_ptr ist so die gemütlichste Variante, sollte man aber nur benutzen, wenn man das Objekt wirklich rum reichen will, weil es natürlich etwas mehr Performance kosten kann (ist aber besser als wenn das Prog abstürzt).
-
anonymus schrieb:
nach dem Löschen den Zeiger sofort auf NULL setzten.
Dann kann man im weiteren verlauf testen, ob Zeiger NULL ist.
Das wird nicht viel helfen, weil die anderen Pointer die auf das gleiche Objekt zeigen, nicht auf null gesetzt sind. Das ist ja das Problem... welches durchaus nicht ungewöhnlich ist.
-
Das Problem ist, dass zu dem Zeitpunkt, wo das Objekt gelöscht wird, die betreffende Funktion gar keinen Zugriff auf den Zeiger hat.
Das Programm ist Multithreaded (mit Boost:Threads) und benutzt Lua. Der Ablauf ist folgender:
Objekt wird erzeugt
Ein Thread wird erzeugt
Der Thread speichert den Pointer auf das Objekt in der Lua-Registry und startet ein script
Während das script läuft, wird das Objekt von der Funktion zerstört, die es auch erstellt hat.
Lua ruft eine C++-Funktion auf, welche den Pointer aus der Lua-Registry holt und damit rumspielen will
-> Fehler!!!
-
dann muss sich das script auch drum kümmern den zeiger für ungültig zu erklärn
-
Das Problem ist, dass das script vom anwender und nicht von mir geschrieben wird und der anwender ist das unberechenbarste an einem programm
Würde ich den zeiger in der aufgerufenen c++-funktion für ungültig erklären, könnte diese funktion nur ein mal im script aufgerufen werden, was auch nicht das wahre ist. ich habe inzwischen eine komplizierte lösung gefunden, trotsdem danke.