push & pop / new & delete



  • Hallo !
    Schreibe gerade ein Programm um Kloetze zu stapeln. Die Kloetze bzw. Quader lassen sich problemlos anlegen und ausgeben. Probleme gibt es erst seit ich versuche zu stapeln.
    Ich kann jetzt mit push problemlos einen Klotz anlegen und ausgeben und mit pop wieder entfernen. Sobald ich allerdings einen zweiten eingebe gibt es einen Segmentation Fault. Woran kann das liegen? Bin fuer jeden Tipp dankbar !

    Tobias

    #include"stapel.h"
    #include"klotz.h"
    #include"point.h"
    #include"intervall.h"
    
    Stapel::Stapel(){}
    Stapel::Stapel(const Stapel &){}
    Stapel::~Stapel(){}
    
    void Stapel::push(const klotz &NK){
    
      if (sp<10){
    
         K[sp] = new klotz(NK);
         *K[sp]=NK;
         sp++;
         cout<<*K[sp]<<endl;
      }
      else
      cout<<"Der Turm ist hoch genug !!!"<<endl;
    }
    
    const klotz& Stapel::top(){
      cout<<"Klotz "<<sp<<":"<<*K[sp]<<endl;
    }
    
    klotz Stapel::pop(){
      cout<<sp;
      if (empty()!=1){
        top();
        delete[] K[sp-1];
        sp--;
    
      }
      else
      cout<<"Es existiert kein Klotz !"<<endl;
    }
    
    int Stapel::getsp() const {
      return sp;
    }
    
    bool Stapel::empty(){
     if (sp==0){
       return true;
     }
     else
       return false;
    }
    
    const klotz& Stapel::operator[] (int i){
        return *K[i];
    }
    

    P.S.: Wenn Ihr noch mehr Quelltext braucht, poste ich den auf Anfrage



  • Du legst einen neuen Klotz mit K[sp] = new klotz(NK); an gibst ihn aber mit delete[] K[sp-1]; frei, das ist schonmal falsch. Du musst ihn dann auch mit delete K[sp-1] freigeben, zu jedem new ein delete und zu jedem new[] ein delete[]!



  • Diese Zeilen hier:

    K[sp] = new klotz(NK);
         *K[sp]=NK;
    

    sind nicht sonderlich geschickt. Das new erzeugt ein Objekt klotz (nenne doch so eine Klasse bitte "Klotz" und nicht "klotz") über den Copykonstruktor. D.h. der in K[sp] abgelegte Zeiger zeigt auf eine frische Objektkopie von NK.

    Und in der Zeile tiefer willst Du dann der frischen Objektkopie das Klotzobjekt NK zuweisen. Irre ich mich, oder hast Du die Kopie nicht bereits eine Zeile höher angefertigt?


Anmelden zum Antworten