Attribute d. Klasse A ändern Verhalten von Klasse B
-
Hallo,
einen passenden Titel für meine Frage zu finden ist ja schon alleine ein Post wert.(Naja oder auch nicht)
Hier mein Problem mit mir unerklärlichem Verhalten meines Programms:Mein Programm besteht aus zwei Klassen (Player und MD2Model). Player besitzt zwei Pointer auf Objekte der Klasse MD2Model, sowie einen Pointer auf ein Float-Vektor. (Player ist ein Singleton, also besitzt es noch eine Instanz von sich selbst)
Der Header sieht so aus:#define PLAYER Player::get_player() class Player { public: static Player* get_player(); ~Player(); void load_player_model1( char* f, char* t ) {mP1Model->load(f,t);} void load_player_model2( char* f, char* t ) {mP2Model->load(f,t);} void draw(); void set_position( float x, float y, float z ) { mPosition[0] = x; mPosition[1] = y; mPosition[2] = z; } private: static Player* mSingleton; protected: Player(); MD2Model *mP1Model; MD2Model *mP2Model; float *mPosition; };Die Implementierung:
Player::Player() { mP1Model = new MD2Model(); mP2Model = new MD2Model(); mPosition = new float[3]; set_position( 0.0, 0.0, 0.0 ); } Player *Player::mSingleton = 0; Player* Player::get_player() { if ( mSingleton == 0 ) { mSingleton = new Player; } return mSingleton; } void Player::draw() { mP1Model->animate( 200, mPosition ); mP2Model->animate( 200, mPosition ); }Die Klasse MD2Model besitzt eine Methode zum Laden und eine zum Zeichnen von 3D-Modellen. Als Attribute gibt es nur zwei riesige float Vektoren. Die dynamische Speicherbelegung habe ich schon ziemlich pingelig getestet. Deshalb schließe ich mal ein Buffer over oder underrun in MD2Model aus. (s.u.)
Main sieht so aus:
int main(...) { // hier kommt ein wenig GL Code... MD2Model *m1 = new MD2Model(); MD2Model *m2 = new MD2Model(); m1->load("mod1.md2","mod1.png"); m2->load("mod2.md2","mod2.png"); PLAYER->load("mod1.md2","mod1.png"); PLAYER->load("mod2.md2","mod2.png"); while(true) { m1->animate( 200, myPos ); m2->animate( 200, myPos ); PLAYER->draw(); } }Bis hier her funktioniert alles wie gewünscht.
Das Hinzufügen eines weiteren Attributs (beliebigen Typs z.B. float mVelocity) zu Player produziert einen komischen Fehler:
Nach dem ersten Aufruf von Player::get_player() - was wiederum einmal den Ctor von Player aufruft - werden die Daten des als nächstes initialisierten MD2Model objekts verfälscht. Dabei ist es egal, ob Daten schon geladen sind, oder nur new MD2Model aufgerufen wurde. Ein paar weitere Dinge:1. Es kommt nie zu einer Speicherzugriffsverletzung. (Auch nicht wenn man das ganze mal mit electic fence oder duma testet. s.u.)
1.1 Mit efence o.ä. läuft alles wie gewünscht. (Die Tools belegen - glaube ich - bei jedem Aufruf von malloc/new eine neue Seite. Also werden die Daten im Speicher etwas separiert.)3. Mit folgender Lösung läuft alles wie gewünscht.
PLAYER; MD2Model *trashModel = new MD2Model(); // wird nie mehr verwendet // man kann auch TYP_SONSTWAS *trash = new TYP_SONSTWAS[xyz] nehmen PLAYER->load(..);4. Es ist egal, ob der Aufruf "new MD2Model" aus Player oder irgendwo anders her stammt.
Das Ganze deutet doch darauf hin, "new" die Größe von Player nicht richtig erkennt, wenn es in get_player() aufgerufen wird?

Vielleicht fällt ja jemanden von Euch was an meiner Playerklasse auf.
Vielen Dank
Christian