Gültigkeitsbereich im Heap



  • class uebung
    {
    public:
    int zahla;
    };

    void beispiel(uebung b)
    {
    b->zahla = 10;
    cout<<a->zahla; //FEHLER:"'a' was not declared in this scope"
    }
    int main()
    {
    uebung
    a = new uebung;
    a->zahla = 0;
    cout<<a->zahla<<endl;

    beispiel(a);
    cout<<a->zahla<<endl;
    return 0;
    }

    Ich habe gerade in einem c++ Buch gelesen,dass bei Objekten oder Variablen,die auf den Heap Ppeicher gelegt werden ,der Gültigkeitsbereich nicht verlassen wird,wenn die Variable/ das Objekt z.B eine Funktion verlässt.

    Müssten demnach nicht das Objekt "a" der Klasse "uebung" einen globalen Gültigkeitsbereich haben? Ich habe diesen Versuch gestartet ,weil ich mir dachte ,dass die Funktion auf die Variable zugreifen kann, da sie ja im Heap abgelegt wurde.

    Heißt diese Fehlermeldung also ,Funktionen ihren eigenen Gültigkeitsbereich und somit auf Variablen oder Objekte außerhalb nicht zugreifen können?

    Ich weiss wie ich diesen Fehler beheben kann,aber darum geht es mir nicht.Ich will einfach nur den Hintergrund verstehen.

    Danke für eure Antworten im Voraus!:)



  • Wann lernst Du eigentlich mal, Codetags zu benutzen?



  • Hallo.

    also zunächst mal zur Übersicht:

    class uebung
    {
        public:
        int zahla;
    };
    
    void beispiel(uebung *b)
    {
        b->zahla = 10;
        cout<<a->zahla; //FEHLER:"'a' was not declared in this scope"
    }
    
    int main()
    {
        uebung* a = new uebung;
        a->zahla = 0;
        cout<<a->zahla<<endl;
    
        beispiel(a);
        cout<<a->zahla<<endl;
        return 0;
    }
    

    Ja 'a' ist nicht deklariert, daher auch der Fehler. Wenn du eine Variable oder Objekt im Heap erzeugst, so kannst du schon von überall darauf zugreifen, sofern du darauf in referenzierst. Das bedeutet aber nicht, dass 'a' nun eine globale Variable wird. Erstellst du z.B. eine Variable in einer Funktion via "int X;" so wird diese Variable im Stack erstellt. Beim Verlassen dieser Funktion, wird 'X' freigegeben. Erstellst du die Variable stattdessen im Heap mit "int *X = new int;" und du verlässt die Funktion, so bleibt 'X' erhalten. ...und zwar bis zum Programmende oder dem delete-Befehl.

    Google mal am besten nach den Schlagwörtern "Heap" und "Stack".

    viele Grüße,
    SBond



  • SBond schrieb:

    [...] Erstellst du die Variable stattdessen im Heap mit "int *X = new int;" und du verlässt die Funktion, so bleibt 'X' erhalten. ...und zwar bis zum Programmende oder dem delete-Befehl.

    Sorry, SBond, aber ich fürchte, Deine Erklärung verwirrt mehr, als sie hilft.

    Mit new (oder new[] ) reserviert (alloziiert) man einen Happen des Freispeichers für sein Programm. Damit man diesen Speicherbereich auch nutzen kann, merkt man sich die vom Operator new zurückgegebene Adresse in einem Pointer. Der Pointer selbst liegt aber am Stapelspeicher und ist in seinem scope gültig. Verlässt die Programmausführung den Gültigkeitsbereich des auf den angeforderten Speicher zeigenden Pointers, sollte man sich die Adresse anderweitig "gemerkt" haben. Andernfalls wird es unmöglich, den reservierten Speicher zu verwenden, noch ihn jemals wieder freizugeben.

    Dein Beispiel:

    class uebung
    {
        public:  // struct statt class und das public ist geschenkt.
        int zahla;
    };
    
    void beispiel(uebung *b)
    {
        b->zahla = 10;
    //  cout<<a->zahla;  // a gibts hier nicht. Dazu hast du die Adresse ja als
    //                   // Funktionsparameter b uebergeben *)
    
        // also verwendest du hier den namen b um auf den Speicher zuzugreifen,
        // dessen Adresse du der Funktion beim Aufruf uebergeben hast:
    
        cout << b->zahla;
    }
    
    int main()
    {
        uebung* a = new uebung;
        a->zahla = 0;
        cout<<a->zahla<<endl;
    
        beispiel(a); // Uebergabe des Wertes (der Adresse) von a
        cout<<a->zahla<<endl;
        return 0;
    } // wer raeumt die uebung weg?? delete fehlt.
    

    😉 der genausogut auch a heißen könnte. ober hugo oder aladin . Es ist eine Variable deren Gültigkeitsbereich auf die Funktion beispiel() beschränkt ist und nicht mit dem a aus main() identisch.



  • Swordfish schrieb:

    Sorry, SBond, aber ich fürchte, Deine Erklärung verwirrt mehr, als sie hilft.

    ja da hast du wohl recht 😉



  • danke für eure antworten jetzt habe ichs verstanden:)

    und sorry mit der übersicht ich veruche nächstes mal dran zu denken


Log in to reply