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 forms
    

    Kurt



  • 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.


Anmelden zum Antworten