delete



  • Hallo!

    Ich habe folgenden code

    int* a;
    a = new int[100];
    delete a;

    Woher weiß der delete-Operator eigentlich, wie groß der Speicherberei ist, den er wieder freigeben soll?

    Danke!

    mfg



  • So wiet ich weiß ist das dem Compiler überlassen. Üblich ist es vor den eigentlichen Daten die Größe zu speichern.

    Außerdem ist ein Fehler in deinem Code:

    es muss delete [] foo heißen.



  • Ach ja, natürlich delete []a;
    Hab es vorher so schnell eingetippt, da ist mir das gar nicht aufgefallen.

    "Es ist dem Compiler überlassen":
    Meinst du damit, dass der delete-Operator so eine Art Parameter braucht, der die Größe des Speicherbereis angibt, dieser "Parameter" aber vom Compiler automatisch "übergeben" wird?
    Ich habe mir das bisher so vorgestellt, dass der Compiler nachschaut wie groß das Feld angelegt wurde, und dann auch dementsprechend wieder deallokiert. Das funktioniert aber bestimmt nicht, wenn man Felder dynamisch anlegt.

    Beispiel:

    int* feld;
    int groesse;

    scanf("%d", &groesse);
    feld = new int[groesse];
    delete [] feld;

    Hier kann der Compiler sicher noch nicht wissen, wie groß das Feld einmal wird.

    Und was meinst du mit "Üblich ist es vor den eigentlichen Daten die Größe zu speichern."
    Meist du, dass man in den ersten Array-Eintrag die Größe des Arrays schreibt? Könnte z.B. bei char-Arrays mit über 255 Elementen problematisch werden.

    PS: Der CPP-Tag funktioniert irgendwie nicht. Sollte doch reichen, wenn man vor dem Code mit cpp in eckigen Klammern öffnet, und mit /cpp wieder schließt, oder?

    mfg



  • Du hast recht, der Compiler kann es nicht wissen. Aber new[] macht folgendes:

    ES holt sich einen Speicherbereich und ganz vorne schreibt es sich rein, wie groß der ist. Dann rückt es den Zeiger ein Stück weiter und gibt Dir diese Adresse zurück. Wenn Du dann delete [] aufrufst weiß er: Ich muß nur ein kleines Stückchen weiter vorne gucken, da steht wieviel es ist.
    Das muß natürlich nicht so implementiert sein, ist aber vermutlich in den meisten fällen so. Bei einem gewöhnlichen delete ist so eine Zusatzinfo unnötig.

    MfG Jester



  • Hallo,
    ein ähnliches Thema hatten wir gerade erst. Die Suchfunktion könnte hier ganz toll helfen.


Anmelden zum Antworten