Ausgabe eines dynamischen Feldes liefert falsche Werte



  • Hallo zusammen,

    wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr... 😞

    Ich habe folgendes Problem:
    Im Konstruktor einer Klasse initialisiere ich ein dynamisches Feld mit absteigenden Werten (Die "Hilfs-"ausgabe liefert auch die korrekten Werte).
    In einer weiteren Funktion sollen lediglich alle Werte am Bildschirm ausgegeben werden. Da tauchen auf einmal völlig andere Werte auf, als wenn ich auf Elemente außerhalb des Feldes zugreifen würde. Allerdings sehe ich meinen Fehler nicht und wenn ich meinen Code debugge, stehen immer die korrekten Werte in dem Feldern.
    Noch dazu kommt, dass es nicht bei jeder Ausgabe generell falsch ist... 😕

    Mein Code sieht wie folgt aus:

    #include <iostream>
    
    using namespace std;
    
    class turm{
        public:
            turm(int x);
            int hoehe;
            int* scheiben;
            void druck();
            ~turm();
    };
    turm::turm(int x){
        scheiben = new int;
        hoehe = x;
    
        for (int i=0; i<hoehe; i++){
            *(scheiben+i) = hoehe-i;
            cout<<*(scheiben+i)<<endl;
        }
    }
    void turm::druck(){
        cout<<"Der Turm ist wie folgt aufgebaut:"<<endl;
        for (int i=hoehe; i>0; i--){
            cout<<"Auf "<<i<<". Hoehe liegt Scheibe "<<*(scheiben+(i-1))<<endl;
        }
        cout<<endl;
    }
    turm::~turm(){
        scheiben = NULL;
    }
    
    int main()
    {
        int anz = 4;
    
        turm start(anz);
        turm hilf(anz);
        turm ende(anz);
    
        start.druck();
        hilf.druck();
        ende.druck();
    
        start.~turm();
        ende.~turm();
        hilf.~turm();
        return 0;
    }
    

    Bsp. einer Ausgabe:
    4
    3
    2
    1
    4
    3
    2
    1
    4
    3
    2
    1
    Der Turm ist wie folgt aufgebaut:
    Auf 4. Hoehe liegt Scheibe 1
    Auf 3. Hoehe liegt Scheibe 2
    Auf 2. Hoehe liegt Scheibe 3
    Auf 1. Hoehe liegt Scheibe 4

    Der Turm ist wie folgt aufgebaut:
    Auf 4. Hoehe liegt Scheibe 201326593
    Auf 3. Hoehe liegt Scheibe 2046082959
    Auf 2. Hoehe liegt Scheibe 3
    Auf 1. Hoehe liegt Scheibe 4

    Der Turm ist wie folgt aufgebaut:
    Auf 4. Hoehe liegt Scheibe 1
    Auf 3. Hoehe liegt Scheibe 2
    Auf 2. Hoehe liegt Scheibe 3
    Auf 1. Hoehe liegt Scheibe 4

    Schon mal vielen Dank für eure Antworten!!!



  • Studentin schrieb:

    scheiben = new int;
    

    Um wie viele Scheiben geht es noch gleich?
    Schon mal von std::vector gehört?



  • Ach, und

    scheiben = NULL;
    

    ist auch nicht so das Wahre.



  • Und man soll wirklich nicht manuell den dtor aufrufen, außer man hat erstaunlich plausible Gründe.



  • Vielen Dank für die vielen schnellen Antworten.

    Nachdem ich das "new" jetzt richtig anwende, funktioniert es auch.

    Vom std::vector hatte ich bisher noch nichts gehört, werde es aber gleich mal damit versuchen.

    Den Destruktor habe ich nur deswegen am Ende des Programms aufgerufen, weil ich völlig verzweifelt war (und mir irgendwie klar war, dass ich bestimmt irgendwo eine "Kleinigkeit" vergessen hatte)

    Außerdem habe ich den Destruktor für die bisherige Lösung jetzt mit delete[] hoffentlich verbessert.



  • Wenn du "richtig" C++ machen willst, sind new[] und delete[] völlig out. std::vector ist viel, viel einfacher zu verwenden, und verhindert quasi von selbst solche Fehler wie die von dir gemachten. Manuelle Speicherverwaltung ist kaum das richtige Gebiet für Anfänger.


Anmelden zum Antworten