Arrays von Zeigern



  • In dem Program kommt es zu einem Speicherfehler wenn man die Schleife nicht richtig durchläuft. Warum?

    Außerdem möchte ich wissen warum ein Fehler angezeigt wird, wenn man das Objekt Cat auf dem Heap nachher löschen will mittels delete.

    #include <iostream.h>
    
    class CAT
    {
    
        public: 
            CAT() {itsAge=1;itsWeight=5;}
            ~CAT();
            int GetAge() const {return itsAge;}
            int GetWeight() const {return itsWeight;}
            void SetAge(int Age){itsAge=Age;}
    
        private:
            int itsAge;
            int itsWeight;   
    };
    
    int main(){
    
        CAT * Family[500];
        int i;
        CAT * pCat;
        for(i=35;i<500;i++){ // warum bei 0 anfangen ?
        pCat=new CAT;
        pCat->SetAge(2*i+1);
        Family[i]=pCat;    
        // delete pCat;  erzeugt Fehler!!
        }       
    
        for(i=0;i<500;i++){
         cout << "Katze #"<< i+1<<": ";
         cout << Family[i]->GetAge()<<endl;   
        }    
        system("pause");
        return 0;
    }
    


  • Wenn du nicht bei 0 anfängst sondern irgendwo mittendrin z.B. 35
    Dann sind die Zeiger zwischen Familiy[0] und Familiy[34] auch keine
    gültigen Zeiger auf Cat-Objekte.

    D.h. wenn du später über Familiy[0]->GetAge() auf die Zeiger zugreifst,
    zeigen diese irgendwo in den Speicher.
    Und da kann nicht viel mehr dabei rauskommen als ein Speicherzugriffsfehler.



  • david3252 schrieb:

    In dem Program kommt es zu einem Speicherfehler wenn man die Schleife nicht richtig durchläuft. Warum?

    Außerdem möchte ich wissen warum ein Fehler angezeigt wird, wenn man das Objekt Cat auf dem Heap nachher löschen will mittels delete.

    #include <iostream.h>
    
    class CAT
    {
     
        public: 
            CAT() {itsAge=1;itsWeight=5;}
            ~CAT();
            int GetAge() const {return itsAge;}
            int GetWeight() const {return itsWeight;}
            void SetAge(int Age){itsAge=Age;}
            
        private:
            int itsAge;
            int itsWeight;   
    };
    
    int main(){
     
        CAT * Family[500];
        int i;
        CAT * pCat;
        for(i=35;i<500;i++){ // warum bei 0 anfangen ?
    

    tja, weil der Array den du initialisierst immer mit 0 anfaengt zu zaehlen. Wenn du nicht verstehst warum man bei null anfaengt zu zaehlen schau dir mal die natuerlichen Zahlen in deinem Mathebuch an.

    pCat=new CAT;
        pCat->SetAge(2*i+1);
        Family[i]=pCat;    
        // delete pCat;  erzeugt Fehler!!
    

    du hast keinen destruktor geschrieben, sondern nur einen definiert. Bei deinem Beispiel kannst du den destruktor auch weglassen da du keine Resource in deinem Konstruktor allocierst. Im Klartext du reservierst dir keinen Speicher mit new im Konstruktor.

    }       
        
        for(i=0;i<500;i++){
    

    damit duerfte dieser Teil hier auch Fehlerhaft sein. Du kannst aber hier ab 35 anfangen auszugeben. Denn zurzeit versucht du auf Null Pointer zuzugreifen. Den die ersten 35 Elemente in deinem Array sind Null Pointer und zeigen ins nirvana. Erst der rest ab 35 hat ein Objekt zugewiesen bekommen in deiner oberen schleife.

    cout << "Katze #"<< i+1<<": ";
         cout << Family[i]->GetAge()<<endl;   
        }    
        system("pause");
        return 0;
    }
    

Anmelden zum Antworten