Frage zu Memory Leaks



  • Juten Abend...
    wollte nur mal eben fragen, ob ich Zeiger, für die ich auf dem Heap keinen
    Speicher reserviert habe, wieder "freigeben" muss:

    int iVar = 5;
    int *pVar = &iVar;
    //freigeben?
    

    ... und welche Auswirkungen genau Memory Leaks haben...

    thx! 😃



  • zu den auswirkungen:

    Wenn deine Anwendung lange im betrieb ist oder sehr häufig memory leaks auftreten verringert sich natürlich dein Speicher. Und irgendwann ist schluß -> dein rechner geht in die Knie.

    Besonders bei Serveranwendungen übel



  • 1.) Nein musst du nicht.
    2.) Inbesondere bei Programmen die "lange" laufen, z.B. Serveranwendungen fallen Memory Leaks dahingehend negativ auf, das nach gewisser Zeit keine Speicher mehr für diese aber auch für andere Anwendungen mehr zur Verfügung steht. Das wiederum heisst meist, nix geht mehr. 🙂

    mfg JJ



  • Wo kein new da auch kein delete.



  • Du solltest dich ein bisschen genauer ausdrücken (*Lehrer Gewand anzieh*).

    Für Zeiger reservierst du meistens gar keinen Speicher auf dem Heap, außer der Zeiger selber liegt auf dem Heap.

    So etwas

    Foo* myFooPointer;
    

    erstellt einen Zeiger auf dem Stack. Um den musst du dich natürlich nicht kümmern. Diesen Zeiger kannst du auf beliebiges Foos (und davon abgeleitete Typen) zeigen lassen, egal wo diese Foos liegen.

    Foos kannst du auch auf dem Heap erstellen, am besten mit new. Wenn du das tust, dann musst du für dieses Objekt wieder delete aufrufen (was natürlich nur geht, wenn du einen Zeiger darauf hast).

    Foo* myFooPointer = new Foo();
    myFooPointer = 0;
    

    Jetzt hast du keine Chance mehr, dieses neu erstellte Foo-Objekt zu löschen, weil du seine Adresse nicht kennst. Ab diesem Moment spricht man von einem Memory Leak.

    Wenn du Foo-Objekte auf dem Stack hast, dann darfst du sie nicht löschen. Völlig egal, ob du per Zeiger oder Referenz oder sonstwas darauf verweist.
    Ob du ein Objekt löschen musst, hängt nur davon ab, wie du es erstellt hast.



  • crazychicken schrieb:

    Juten Abend...
    wollte nur mal eben fragen, ob ich Zeiger, für dich ich auf dem Heap keinen
    Speicher reserviert habe, wieder "freigeben" muss:

    int iVar = 5;
    int *pVar = &iVar;
    //freigeben?
    

    Ich sehe keine Zeiger die du auf dem Heap allokierst, lediglich einen Zeiger der auf dem Stack erzeugt wurde und auf ein lokales Objekt zeigt.

    Normalerweise allokiert man auf dem Heap keinen Speicher für einen Pointer, sondern für ganze Objekte. Speicher der mit new bzw. new[] allokiert wurde, muss dementsprechend mit delete bzw. delete[] gelöscht werden.



  • Ist eigentlich wirklich ein Unterschied zwischen freestore (new/delete) und heap (malloc/free)?



  • Shlo schrieb:

    Ich sehe keine Zeiger die du auf dem Heap allokierst.

    Hat auch nie einer behauptet. wer lesen kann is klar im vorteil



  • hugo! schrieb:

    Ist eigentlich wirklich ein Unterschied zwischen freestore (new/delete) und heap (malloc/free)?

    freestore und heap sind einfach 2 Begriffe für das selbe Ding.
    malloc/free kommen von C und sollten in C++ nicht mehr benutzt werden (alleine schon deshalb nicht, weil malloc nicht den Ctor aufruft).
    new/delete sollte man übrigens nie mit malloc/free mischen.



  • Leser schrieb:

    wer lesen kann is klar im vorteil

    Wo du Recht hast...



  • so... jetzt erst einmal vielen Dank für die ganzen Antworten!!! 😉
    PS: hab erst jetzt gemerkt, dass ich in meinem Posting nen dicken
    Rechtschreibfehler hatte... peinlich peinlich... 🙄


Anmelden zum Antworten