Ausnahme nach aufruf von klassenmethode aus globaler Funktion
-
Hallo,
Ich hab da mal ein schönes Problem.
Ich habe eine Klasse GameController (Singleton) und weiterhin eine globale funktion:
void nearCallback (void *data, dGeomID o1, dGeomID o2) { GameController::Instance()->physicCollisionEvent(GeomgetDate(o1),GeomgetDate(o2)); }GeomgetData(...) liefert void pointer;
bei einem aufruf im Code an GameController bekome ich eine Ausnahme sprich eine Zgriffsverletzung.
1. Warum ???
2. gibt es eine Lösung dafür, z.B. über namesräume.
-
donvitoni schrieb:
Ich hab da mal ein schönes Problem.
Wie beurteilst du das?

Zeig mal den Code für physicCollisionEvent, zumindenst wo dieses throw
die Ausname auslöst
-
1. Weil du auf einen Speicherbereich zugreifst, obwohl du es nicht darfst.
2. Nicht auf diesen Speicher zugreifen.

-
Wie beurteilst du das?
Naja mir ist das so noch nicht untergekommen, schreibe aber schon recht lange in c++.
Zeig mal den Code für physicCollisionEvent, zumindenst wo dieses throw
die Ausname auslöst.der Code ist eigentlich unwichtig. Es geht auch nicht wenn z.b. void foo(){} im Gamecontroller aufgerufen würde.
Wenn die Funktion zurückkehrt gibt es diese Zugriffverletzung.
Ich gehe mit den Debugger in diese aufgerufene Funktion und wenn ich diese Funktion verlasse kommt die Zugriffverletzung.1. Weil du auf einen Speicherbereich zugreifst, obwohl du es nicht darfst.
2. Nicht auf diesen Speicher zugreifen.zu 2.
geht es auch präzieser.Danke schonmal für die Antworten.
-
donvitoni schrieb:
der Code ist eigentlich unwichtig.
Nein, der ist wichtig, weil meine Kristallkugel kaputt ist.
-
donvitoni schrieb:
Naja mir ist das so noch nicht untergekommen, schreibe aber schon recht lange in c++.
Das war ironisch gemeint bezogen auf --> "schönes Problem".
Edit:
Vermutten kann man das die function GeomgetData(...)
einen ungültigen ponter liefert, den du in der function
physicCollisionEvent verwendest.
-
Nein, der ist wichtig, weil meine Kristallkugel kaputt ist.
ok, nehmen wir an es sei die angesprochene methode void foo();
class GameController { private: static GameController* _instance; protected: GameController(){} ~GameController(){} public: GameController* Instance() { if(_instance == 0) _instance = new GameController(); return this->_instance; } void foo(){} //... }der aufruf
void nearCallback (void *data, dGeomID o1, dGeomID o2) { GameController::Instance()->foo(); }ergibt den gleichen Fehler
-
Vermutten kann man das die function GeomgetData(...)
einen ungültigen ponter liefert, den du in der function
physicCollisionEvent verwendest.die liefern auf jedenfall keine NullPointer oder pointer auf unbekannte objecte
-
Ich gehe mit den Debugger in diese aufgerufene Funktion und wenn ich diese Funktion verlasse kommt die Zugriffverletzung.
Hast du dir evtl. deinen Stack zerschossen (z.B. lokales Array angelegt und Schreibzugriff außerhalb der erlaubten Indizes 0...N-1)?
Auf dem Stack werden nämlich auch die Rücksprungadressen der Funktionsaufrufe gespeichert und wenn die nicht mehr stimmen, dann peng!
-
die methode muss static sein und this hat da nichts zu suchen
static GameController* Instance() { if(_instance == 0) _instance = new GameController(); return _instance; }PS: es war ein compilerfehler und keine Ausname, oder?
-
Hast du dir evtl. deinen Stack zerschossen (z.B. lokales Array angelegt und >Schreibzugriff außerhalb der erlaubten Indizes 0...N-1)?
Auf dem Stack werden nämlich auch die Rücksprungadressen der Funktionsaufrufe >gespeichert und wenn die nicht mehr stimmen, dann peng!nein, aber in GameController sind STL-Objecte die von VRS verwaltet werden
die methode muss static sein und this hat da nichts zu suchen
PS: es war ein compilerfehler und keine Ausname, oder?ich bin auf arbeit und hab den Code nicht vor mir.
Aber der fehler kommt beim Debuggen.