Zugriffsverletzung von KlassenMethode auf Klassenvariable



  • Hi Leute,

    ich versteh einfach nicht wie es hier zu einer Zugriffsverletzung kommen kann.

    Beim Zugriff auf CityOwner schmiert mit das Programm ab.

    Der Gesamte Zugriff wird von aus dem Objekt das den Zeiger auf TheCity enthält folgendermassen eingeleitet.

    if(TheCity != NULL)
        TheCity->Save(list);
    

    Die Deklaration:

    class City {
        private:
            int CityOwner;
        public;
            void City::Save(TStringList * list);
            City::City();
            City::~City(){};
    };
    

    Und die Implementierung:

    City::City(){
            CityOwner = -1;
    }
    
    void City::Save(TStringList * list){
        list->Add("BeginCity");
        if(CityOwner != -1) //hier knallt es
            list->Add("\tCityOwner="+AnsiString(CityOwner));
    
        list->Add("EndCity");
    }
    

    Wäre echt super wenn Sich jemand kurz die Zeit nehmen könnte zu schaun ob er etwas gravierndes erkennen kann. Ich war eigendlich der Meinung dass ich auf meine Klassenvariablen ohne weiteres zugreifen kann aber dem scheint wohl leider nicht so zu sein.

    Vielen Dank für all die Zeit

    Grüße

    Grey



  • Hallo

    Selbstverständlich kannst du auf die Klassenmember zugreifen. Syntaktisch ist dein Code in Ordnung.
    Dein Problem dürfte auch nicht der Member an sich sein, sondern die Instanz von City beim Aufruf von Save(...). Sicherlich ist hinter dem Pointer TheCity kein gültiger Wert, aber eben auch nicht NULL. Sowas kann zum Beispiel durch sowas provoziert werden

    City* TheCity; // Keine gültige Instanz aber TheCity ist auch nicht NULL!
    if(TheCity != NULL) 
        TheCity->Save(list); // Zugriffsfehler
    

    bis bald
    akari



  • Danke Akari,
    sowas dachte ich mir auch schon in der Art da ich bei den Breakpoints plötzlich so wilde Werte bekommen habe. Und wie es nunmal so will ist mein Code exakt wie du ihn als Bad-Case Beispiel gepostet hast. 😕

    Ich glaube ich hab mich wieder in mein Java Verhalten zurückfallen lassen und darauf verzichtet die Zeiger mit NULL zu initialisieren. Es scheint wohl so zu sein das in Cpp Zeiger automatisch mit irgendeiner Freien Adresse initialisiert werden und eben leider nicht mir NULL.

    Ne Initialisierung mit NULL hat natürlich den Fehler behoben.

    Danke nochmals fürs drübergehn. 👍



  • Hallo

    Es scheint wohl so zu sein das in Cpp Zeiger automatisch mit irgendeiner Freien Adresse initialisiert werden und eben leider nicht mir NULL.

    Nein, nichts wird mit irgendeiner Adresse initialisiert, in C++ wird bei Pointern und PODs gar nichts gemacht. Wenn keine Initialisierung durch den Quellcode gemacht wird reserviert der Compiler nur den Speicher, unabhängig davon was davor drinne stand. Da die genannten Typen auch keine Standard-Konstruktoren haben (bzw. diese keine Auswirkung haben) wird auch kein Speicher überschrieben bzw. genullt. Das ist immer deine Aufgabe, also gewöhne dir gleich an Variablen immer sinnvoll zu initialiseren, wenn du nicht 100% sicher bist das vor dem nächsten Lesezugriff ein entsprechender Schreibzugriff erfolgen wird.

    bis bald
    akari



  • Jau, jetzt wo mir der Fehler passiert ist erinnere ich mich auch sofort wieder daran das in den ganzen Kapiteln über Zeiger in jedem Buch genau das steht, seine Zeiger zu initialisieren. War sicher garnet schlecht dass mich das jetzt 2h rumgefrickel gekostet hat 🙂

    Grüße


Log in to reply