Speichermanagement - Anfängerproblem
-
Hallo,
Leider hab ich mit C++ noch sehr grundlegende Denkprobleme aber vielleicht kann mir ja jemand weiterhelfen.
Folgender Fall: Ich möchte ein einfaches Quadrat generieren mit x,y-Position, Länge, Breite, Farbe und für die Initialisierung brauch ich die Bildschirmweite und -höhe.
Danach weise ich dieses Objekt mit einem Z-Index einem Layer zu und den Layer mit einem Z-Index dem Screen.
Ein Screen wird mit Z-Index dem ScreenHandler übergeben der je nach Wunsch einen bestimmten Screen anzeigt.
ScreenHandler sh; float width = 640.0f; float height = 528.0f; Screen screen; Square square(0, 0, 100, 100, width, height, COLOR_RED); Layer squareLayer; squareLayer.addDrawable(1, &square); screen.addLayer(1, &squareLayer); sh.addScreen(4, &screen); sh.showScreen(4);Dieser Fall funktioniert ohne Probleme. Es wird mir ein hüpsches rotes Quadrat bei Koordinate 0,0 angezeigt (witdh und height beziehen sich auf die Größe des Bildschirms)
Nun will ich diesen Code aus meiner main.cpp raushaben und habe mir dazu eine neue Klasse gebastelt:
Header-Fileclass ScreenFactory { private: float screenWidth; float screenHeight; public: ScreenFactory(float screenWidth, float screenHeight); Screen getScreen(); };CPP-File
#include "ScreenFactory.h" ScreenFactory::ScreenFactory(float screenWidth_, float screenHeight_) { screenWidth = screenWidth_; screenHeight = screenHeight_; } Screen ScreenFactory::getScreen() { Square square(0, 0, 100, 100, screenWidth, screenHeight, COLOR_RED); Screen screen; Layer squareLayer; squareLayer.addDrawable(1, &square); screen.addLayer(1, &squareLayer); return screen; }Ändere ich meinen code in der cpp ab auf:
ScreenHandler sh; float width = 640.0f; float height = 528.0f; ScreenFactory sf(width, height); Screen screen = sf.getScreen(); sh.addScreen(4, &screen); sh.showScreen(4);hängt sich das programm komplett auf.
Ich bin sehr sicher dass es sich um einen Noob-Fehler handelt und es um eine grundlegende CPP Sache geht wie: "Wenn du die funktion getScreen() aufgerufen hast werden danach alle darin vorhandenen Objekte zerstört und deshalb bekommst du einen fetten Fehler..." oder Ähnliches. Hab auch den Screen in der ScreenFactory als globale Variable angelegt bzw nur den Pointer darauf übergeben aber hat nix geholfen.
Von meinem Standpunkt aus mach ich in beiden Fällen das gleiche nur dass ich beim 2ten mal zu nem Fehler komme. Hoffentlich kann mich da jemand berichtigen.
-
Jetzt müsste man wissen, was das alles genau ist. Jedenfalls fallt auf, dass du in Zeile 12 und 13 jeweils Pointer auf lokale Variablen an die Objekte übergibst. Und das ist als Signal zu werten, dass diese Funktionen intern wohl nur eine Kopie der Pointer machen und keine Kopie der Objekte. Wenn du dann diese Objekte mit den Pointern auf lokale Variablen aus der Funktion zurück gibst (was du tust), dann werden diese Pointer ungültig. Wenn die Objekte diese Pointer dann benutzen (was sie höchstwahrscheinlich tun, aber genau können wir das nicht wissen, da du sie nicht zeigst), gibt es undefiniertes Verhalten, was oftmals gleichbedeutend mit den von dir beschriebenen Abstürzen ist.
P.S.: Und ist das was du da treibst nicht ein bisschen anspruchsvoll für jemanden, der sich selbst als Anfänger bezeichnet?
-
SeppJ schrieb:
Wenn du dann diese Objekte mit den Pointern auf lokale Variablen aus der Funktion zurück gibst (was du tust), dann werden diese Pointer ungültig.
Okay das bestätigt meine Vermutung dass die Objekte in der Funktion nach Funktionsaufruf nicht mehr existent sind (was ja eigentlich logisch sein sollte) und damit die Pointer ins nirgendwo weiSen denn wenn das Ganze im main.cpp ist sind die Objekte ja existent...
Danke vielmals kann als gelöst betrachtet werden.
SeppJ schrieb:
P.S.: Und ist das was du da treibst nicht ein bisschen anspruchsvoll für jemanden, der sich selbst als Anfänger bezeichnet?
Nicht lachen, aber in Java !!! bin ich ein richtiger Crack-Er, aber das nutzt mir recht wenig in C++. Man weiS zwar, dass alles irgendwie machbar sein muss, da es auch eine objektorientierte(darüber streitet man ich weiS) Sprache sein soll aber wie genau es geht ist mir manchmal ein Mythos.
Und ich nehm mal sehr heftig an in meinem Fall hab ich vergessen dass es in C++ keinen Garbage Collector gibt.
-
Dreloc schrieb:
Nicht lachen, aber in Java !!! bin ich ein richtiger Crack-Er, aber das nutzt mir recht wenig in C++.
Mit Java wirst du maximal Rechenkönig.
-
Dreloc schrieb:
Und ich nehm mal sehr heftig an in meinem Fall hab ich vergessen dass es in C++ keinen Garbage Collector gibt.
Eigentlich nicht. Das ist für jemanden der von Java kommt sogar sehr sauber und aufgeräumt. Der Fehler liegt an dem ungewöhnlichen Design der Grafikbibliothek die du da benutzt (bzw. so ungewöhnlich ist das auch nicht nicht, da die vermutlich von C kommt. Aber in C++ könnte man das geschickter machen). Alarmsignal für dich als Javaprogrammierer sollte die Benutzung von
newund komplexen Vererbungshierarchien sein, welche in C++ eher in seltenen Spezialfällen benutzt werden. Dann versuchst du Java in C++ zu machen, was nie gut geht.