Statische Zeiger freigeben



  • Hallo.

    Ich deklariere einen Zeiger.

    Weise ihm Heap-Speicher zu.

    Arbeite mit dem Zeiger.

    Gebe den Heap wieder frei, indem ich den Zeiger lösche.

    So sollte man sich die Vorgehensweise von Zeigern vorstellen, die auf den Heap-Speicher zugreifen.

    Jetzt gibt es aber in meinem Code eine Unstimmigkeit: Mein Zeiger ist static.

    Versuche ich den Zeiger dann im späteren Verlauf zu löschen, gibt mir mein Debugger eine Heap Fehlermeldung aus (er kann nicht auf den Heap zugreifen bzw. ihn nicht freigeben).

    Hier kurz ein Beispielcode:

    int iBufferSize;
    static char *szBuffer;
    
    iBufferSize = 100;
    szBuffer = new char( iBufferSize );
    
    // ... mit dem Zeiger arbeiten ...
    
    delete[] szBuffer; // Gibt Fehler beim Debuggen aus, weil Zeiger static ist
    

    - Wieso ist das so? (klar, wegen dem static - aber wie und wieso wirkt static so imens darauf ein)

    - Ist es schlimm, dass ich den Speicher nicht freigeben kann (immerhin belastet man den RAM so unnötig).

    - Gibt der Compiler den Speicher selber wieder frei?

    Gruß, paSe



  • unlimieD.paSe schrieb:

    Gebe den Heap wieder frei, indem ich den Zeiger lösche.

    Du kannst den Zeiger nicht löschen. Höchstens den Speicherbereich dahinter.

    unlimieD.paSe schrieb:

    - Wieso ist das so? (klar, wegen dem static - aber wie und wieso wirkt static so imens darauf ein)

    Nein, es ist nicht wegen static . Hast du das Gleiche mal mit einem Zeiger auf dem Stack probiert?

    unlimieD.paSe schrieb:

    - Ist es schlimm, dass ich den Speicher nicht freigeben kann (immerhin belastet man den RAM so unnötig).

    Ja, du solltest dich darauf achten, angeforderten Speicher wieder freizugeben.

    unlimieD.paSe schrieb:

    - Gibt der Compiler den Speicher selber wieder frei?

    Nein, der Compiler sowieso nicht. Wenn du Glück hast, gibt das Betriebssystem den Speicher beim Beenden frei, aber verlass dich besser nicht drauf. Es ist besser, du hast für jedes new ein entsprechendes delete und für jedes new[] ein delete[] .

    Dein Fehler besteht übrigens darin, dass du delete[] auf mit new allokierten Speicher anwendest. Benutze für die Array-Grösse eckige Klammern.


Anmelden zum Antworten