Accessviolation im Constructor
-
Ich hab eine Klasse bei der im Constructor bei der ersten Zuweisung eine Accessviolation kommt. Hier mal der Aufruf:
TUIManager uimanager; [...]Und hier der Header der Klasse:
class TUIManager { //Manager for the OpenGL-SDL-userinterface private: vector<TglObject*> FormTable; //stores pointers to the forms vector<int> FormList; //stores the IDs of the forms. Order of the forms in list depands on last activity. TglComponent* activeComponent; //points to the active component TglComponent* lastEntered; //points to the component which was recently entered by the mouse. bool active; //stores if the GUI is activated or not. [...] public: // Constructor TUIManager(); // Destructor ~TUIManager(); [...] };und der Constructor sieht so aus:
// Constructor TUIManager::TUIManager() { active = true; //GUI is initialy active. activeComponent = NULL; //At startup there exists no component lastEntered = NULL; //The mouse hasn't entered a component yet FormTable[0] = NULL; //Form Nr.0 is reserved for the UIManager itself. }Bei active = true; kommt ein Fehler... ich hab auch schon die Reihenfolge vertauscht, es kommt immer bei der ersten Zuweisung im Konstruktor der Fehler... Woran liegt das?
-
statt
FormTable[0] = NULL;
nimmst du
FormTable.push_back(NULL);
-
Aber Formtable ist doch ein Vector. Und auf Vectoren kann man Wahlfrei zugreifen. Außerdem kommt der Fehler bei der ersten Zuweisung. Das mit dem Formtable ist ja wie man sieht die letzte.

-
man kann aber nicht auf uninitialisierten speicher zugreifen. es gibt gar kein element 0, wenn du nicht mindestens einmal push_back aufrufst.
der fehler liegt bestimmt an anderer stelle. kannst du ein minimalbeispiel erstellen das den fehler zeigt?
-
KFlash schrieb:
Aber Formtable ist doch ein Vector. Und auf Vectoren kann man Wahlfrei zugreifen.
Nur wenn das Element schon existiert. Also push_back verwenden.
Kurt
-
Ahh...hast recht...hab gerade nochmal die STL Doku angeguckt. Bei Java gabs nen Vector der immer gleich 10 Elemente vorinitialisiert hatte....Naja...leer isses besser.
-
Strange...Auf alle Fälle hat die Änderung das Problem behoben....versteh ich zwar nicht, aber ich bin Glücklich...
Ich dachte immer Programme werden von Oben Nach unten abgearbeitet (Außer so sachen vie VHDL)
Werde wohl im Rahmen meiner C++ Tätigkeit noch mehr mysterien für mich entdecken ... 
-
KFlash schrieb:
Ahh...hast recht...hab gerade nochmal die STL Doku angeguckt. Bei Java gabs nen Vector der immer gleich 10 Elemente vorinitialisiert hatte....Naja...leer isses besser.
Geht auch in c++
vector<TglObject*> FormTable(10); //stores pointers to the formsKurt
-
KFlash schrieb:
Strange...Auf alle Fälle hat die Änderung das Problem behoben....versteh ich zwar nicht, aber ich bin Glücklich...
Ich dachte immer Programme werden von Oben Nach unten abgearbeitet (Außer so sachen vie VHDL)
Werde wohl im Rahmen meiner C++ Tätigkeit noch mehr mysterien für mich entdecken ... 
Ich verstehe DICH nicht.
Du hast nen Variable vom Typ Vektor. Dieser Vektor ist nach Erzeugung
mittels Standardkonstruktor leer, so wie der gesunde Menschen verstand
auch vermuten lässt. Beim Zugriff auf das nicht existierende erste Element
krachts. Das ist ja wohl das natürlichste von der Welt.

Wenn ich andererseits einen Vektor "erzeuge" und da stehn, ohne mein Zutun,
irgendwelche Daten drin würde ICH mich ziemlich wundern.
-
Stimmt...das wäre normal....Allerdings habe ich NICHT auf die Formlist zugegriffen, sondern auf eine unbeteiligte Membervariable. Guckt euch nochmal den letzten Satz meines ersten Postings an.