Globale Zeiger und Speicherreservierung mit New



  • Ich lerne Grade C++ und bin jetzt bei Verkettete Liste angekommen.
    In dem Beispiel aus meinem Buch wird eine Globale Zeiger benutzt.

    // Globale Vars
    struct Knoten* Anker = 0;
    

    es heißt doch das man Globale Variablen vermeiden soll, oder gibt es ausnahmen?

    Ok das Zweite ist das mit New für jedes Listenelement Speicher reserviert wird.
    Der mit delete wieder frei gegeben werden muss um Speicherlecks zu vermeiden, habe ich das richtig verstanden?

    Knoten* node = new Knoten;
    

    Egal welches Beispiel ich mir angeschaut habe, in keinem wird der mit new belegte Speicher frei gegeben.

    Nur damit ich es richtig lerne, kann mir das einer erklären?

    Gruß Steffix



  • Ja, Globale sollten normalerweise vermieden werden.

    Und ja, Speicher, der mit new/new[] reserviert wurde, muss mit delete/delete[] wieder freigegeben werden. Wenn das in deinem Buch tatsächlich nie passiert, solltest du dir ein neues Buch kaufen.



  • Was für ein Buch ist das denn?



  • Zur Einführung in Zeiger könnte dir dieser Artikel helfen: Pointer in C(++)



  • Danke für die schnelle Antwort. Du schreibst normalerweise, gibt es eine Ausnahme für Globale?

    Ok wenn ich versuche die Globale zu vermeiden, dann kann ich den NullZeiger nicht an eine Func. übergeben.

    // Struct 
    struct Knoten {
        int daten;
        struct Knoten* next;
    }
    
    // Globale Vars
    // struct Knoten* Anker = 0;
    
    // Prototype
    bool insert( Knoten* kn, int& var );
    
    int main() {
    
        struct Knoten* Anker = 0;
        int iwert = 5;
    
        // beispiel
        insert( Anker, iwert );
        cout << "Anker = " << Anker << endl;
        // Anker ist nach Func. Aufruf immer noch 0
    
        return 0;
    }
    
    bool insert( Knoten* kn, int& refval ) {
    
        if(kn == 0 ) {
            Knoten* node = new Knoten;
            node->daten = refval;
            node->next  = 0;
            kn = node;
            // hier hat Kn eine Adresse oben in Main hat Anker immer noch 0
        } else {
            // hier weiter code
        }
        return 0;
    }
    

    Wo mache ich den Denkfehler, Anker wird in der Func. doch initialisiert oder?

    Gruß Steffix



  • kn ist eine Kopie von Anker.

    Versuch's mal mit

    bool insert( Knoten*& kn, int& var );
    

    dann sind kn und Anker dasselbe.



  • Das sieht schon wieder verdächting nach JW C++ vAbZ aus.

    Ich glaube, das Beispiel ist nur darauf ausgelegt, die Funktionsweise von verketteten Listen zu erkären, ohne Wert auf Sauberkeit zu legen. Normalerweise würde man sowas in einer Klasse kapseln und bräuchte keine globalen Variablen mehr (und könnte damit auch mehrere verkettete Listen gleichzeitig benutzen).

    @TE:
    Da Anker der Startknoten für die Liste ist, musst du ihm beim Einfügen eines Knotens in eine leere Liste den ersten Knoten zuweisen:

    bool insert( Knoten* kn, int& refval ) 
    {
        if( !kn ) 
        {
            // hier kann direkt mit kn gearbeitet werden, statt einen temporären Zeiger zu benutzen
            kn = new Knoten;
            kn->daten = refval;
            kn->next  = 0;
        } 
        else 
        {
            // hier weiter code
        }
        // wenn der Startknoten nicht besetzt ist muss ihm jetzt der erste Knoten zugewiesen werden
        if( !Anker ) Anker = kn;
    
        return /* 0 */ false; << boolschen Wert benutzen (und warum false zurückgeben?)
    }
    

    Ist nur ein Tipp, da gibt´s noch so viel Verbesserungspotenzial. Bin zu faul, weiter zu schreiben, aber wahrscheinlich fehlen dem TE auch noch die nötigen Grundlagen.



  • Also DocShoe hat es richtig erkannt das Buch ist von Jürgen Wolf und heißt C++ von A bis Z.

    Ich habe mir schon gedacht das es nur ein abgespecktes Beispiel ist.
    Habe versucht das ganze mit einem Lokalen Zeiger auszustatten und bin dabei auf einige Probleme gestoßen, die ich mir nicht selber erklären konnte.

    In dem Buch werden Verkettete List als Klassen gezeigt.
    Nur soweit bin ich noch nicht, mir geht es darum das gelernte auch zu verstehen.

    Caligulaminus

    bool insert( Knoten*& kn, ... )
    

    Die schreib weise kannte ich noch nicht. Ich bin davon ausgegangen das ich eine Zeiger übergebe. Der in Func. Initialisiert wird.

    Dank für eurer Hilfe ich kann es jetzt besser nachvollziehen.

    Gruß Steffix



  • Wirf das Buch weg, benutz es, um das Bett abzustützen oder Zettel zu beschweren, aber guck nicht rein!
    JW lehrt einen verkorksten Mischmasch aus C und C++, daraus etwas lernen zu wollen man man wirklich nicht empfehlen. Der Autor hat es sogar bis zu einem eigenen Thread in diesem Forum gebracht.
    Guck dir stattdessen die Sektion "Buchempfehlungen" an, dort werden gute Bücher vorgestellt.



  • DocShoe schrieb:

    JW lehrt einen verkorksten Mischmasch aus C und C++

    👍
    Das zeigt sich schon dadurch, dass er " struct " vor einer Definition dessen Typ ein struct ist schreibt.



  • Steffix schrieb:

    Also DocShoe hat es richtig erkannt das Buch ist von Jürgen Wolf und heißt C++ von A bis Z.

    You got Rick Rol... Jürgen Wolfed!



  • DocShoe schrieb:

    Wirf das Buch weg, ...

    Mit welchem Buch Arbeitest du, oder kannst du mir ein Buch Empfehlen?



  • EOutOfResources schrieb:

    DocShoe schrieb:

    JW lehrt einen verkorksten Mischmasch aus C und C++

    👍
    Das zeigt sich schon dadurch, dass er " struct " vor einer Definition dessen Typ ein struct ist schreibt.

    Falls ich deine Aussage einigermassen richtig verstanden habe:
    Es ist zwar in dem Fall überflüssig aber völlig legitim das struct dazuzuschreiben, und hat nichts mit C und C++ Mischmasch zu tun.



  • Steffix schrieb:

    DocShoe schrieb:

    Wirf das Buch weg, ...

    Mit welchem Buch Arbeitest du, oder kannst du mir ein Buch Empfehlen?

    C++ Primer, Der C++ Programmierer, Die C++ Programmiersprache oder Einführung in die Programmierung mit C++. Das sind so die Titeln die immer wieder hier im Forum empfohlen werden.



  • Thinking in C++ darf nicht vergessen werden (das gibt's auch kostenlos als pdf im Internet).


Anmelden zum Antworten