static variablen



  • Soweit ich weiß keiner.

    Übrigens, bin da jetzt auch nicht so der Profi
    auf dem Zeigergebiet, aber sollte man nicht eigentlich
    Speicher den man mit new angefordert hat auch wieder
    mit free freigeben? Oder wird auch der Speicher wenn der
    Zeiger stirbt wieder freigegeben?
    Ich kenns nur von C 😉



  • Genau, hab ich vergessen zu schreiben:
    Den Speicher für Variabeln, die du dynamisch (das heisst mit new) deklarierst, solltest du wieder mit delete freigeben, da ansonsten der Speicherplatz nicht mehr genutzt werden kann, was bei Schleifen allmählich den Arbeitsspeicher füllt. Beim Beenden des Programms (v.a. nach längerer Laufzeit) ist der Computer dann langsamer.

    while(i<5)
    {  int *p=new int;
       // ...
       delete p;
    }
    

    Wie blub² bereits sagte, ist const int i mit int const i identisch. const int i ist allerdings die gebräuchlichere Schreibweise.



  • Nexus schrieb:

    Beim Beenden des Programms (v.a. nach längerer Laufzeit) ist der Computer dann langsamer.

    Beim Beenden des Programms sind alle Memory Leaks hinfällig. Das Betrienssystem kratzt das nicht die Bohne. Übrigens, einen einzelnen "int" mit new anzulegen ist wohl arg übertrieben, aber sollte bestimmt nur ein Beispiel sein.



  • danke jungs,ihr habt mir sehr geholfen!!

    gruß



  • funky cat schrieb:

    Nexus schrieb:

    Beim Beenden des Programms (v.a. nach längerer Laufzeit) ist der Computer dann langsamer.

    Beim Beenden des Programms sind alle Memory Leaks hinfällig. Das Betrienssystem kratzt das nicht die Bohne. [...]

    Da bin ich aber anderer Meinung, zumal der Arbeitspeicher auch Zeit braucht, bis er aufgeräumt ist. Ich hab mal ein kleines Spiel programmiert, da konnte man nach dem Beenden eine Minute lang warten, bis man den Computer wieder benutzen konnte. Nachdem ich überall delete und SDL_FreeSurface (eine Grafikfunktion, die einen Zeiger freigibt, also wie delete) hinzugefügt hatte, war das Problem beseitigt.
    Wenn du es nicht glaubst, mach doch mal eine Schleife, die in jedem Durchgang Speicher alloziert und sehr viele Durchgänge hat (halt soviele bis es dein PC nicht mehr verkraftet :D).



  • Natürlich braucht es Zeit, aber der Effekt ist der Gleiche wenn du unheimlich viel Speicher allozierst und dann auf einen Schlag freigibst.



  • Genau.

    Warum geht eigentlich folgendes nicht? Nur wegen dem Variabelnnamen? Der Speicher ist ja eigentlich freigegeben...

    int *p = new int(4);
    delete p;
    int *p = new int(2); // oder anderer Datentyp
    


  • ja. korrekt wäre es so:

    int *p = new int(4);
    delete p;
    p = new int(2);
    //...
    delete p;
    

    nicht zweimal im selben scope eine variable mit demselben namen definieren.



  • Ist es auch möglich, einem Variabelnnamen verschiedene Typen im gleichen Scope zuzuordnen (darauf hat sich auch mein "// oder anderer Datentyp" im letzten Beitrag bezogen)?

    So funktionierts nämlich nicht:

    int *p = new int(4);
    delete p;
    int *p = new float(2.5f);
    


  • Nein, das verletzt die ODR ebenfalls. Egal, welchen Datentypen du angibst. Ein Name darf in dem gleichen Scope nur 1 mal definiert werden.



  • Nexus schrieb:

    So funktionierts nämlich nicht:

    int *p = new int(4);
    delete p;
    int *p = new float(2.5f);
    

    Nein, weil p schon definiert ist. Warum machst du es nicht so?

    int *p = new int(4);
    // ... Mach was mit p
    delete p;
    // Neues p anlegen
    p = (int*)new float(2.5f);
    

Anmelden zum Antworten