delete, delete[], free



  • Hallo,

    ich habe mir mal ein kleines Testprogramm geschrieben, um festzustellen, ob delete, delete[] und free irgend einen Unterschied machen im Hinblick darauf, ob der Speicher wieder freigegeben wird.

    void ShowMem()
    {
        printf("%d\r\n",System::GetHeapStatus().TotalAllocated-start);
    }
    int main(int argc, char* argv[])
    {
         start = System::GetHeapStatus().TotalAllocated;
        ShowMem();      //  0
        ShowMem();      //  400
        ShowMem();      //  400
        char *s1 = new char;
        ShowMem();      //  408
        char *s2 = new char;
        ShowMem();      //  416
        char *s3 = new char[30];
        ShowMem();      //  448
        //free( s3);
        //delete s3;
        delete []s3;
        ShowMem();      //  416
    
        getch();
        return 0;
    }
    

    Eine Konsolenanwendung ("dynamische RTL verwenden" deaktiviert) liefert für die Freigabe von s3 keinen Unterschied.
    Die Frage wäre jetzt, ist dem wirklich so, oder messe ich mit

    System::GetHeapStatus().TotalAllocated;
    

    falsch?

    Das nächste, warum wird für für einen neuen char-Pointer + char-"Zelle" gleich 8 Byte verwendet?

    Wohingegen für das 30er char-Array dann 32 Byte verwendet werden. Da hätte ich dann eher 34 oder 38 Byte erwartet. Und ja, der Speicher von s1 und s2 wird nicht freigegeben.

    Gruß
    Markus



  • Ich weiß zwar nicht, welche Auswirkungen es hat, mit new reservierten Speicher mittels free freizugeben, aber in allen Büchern steht, man soll es nicht machen... Wird wohl seinen Grund haben.

    Der Unterschied zwischen delete und delete[] auf ein Array ist, dass bei delete nur das erste Objekt im Array freigegeben wird, bei delete[] alle Objekte im Array freigegeben werden.



  • Ich weiß zwar nicht, welche Auswirkungen es hat, mit new reservierten Speicher mittels free freizugeben

    Solange es um PODs geht wird es wohl kaum einen Unterschied machen. Bei free wird eben, im Gegensatz zu delete, kein Destruktor aufgerufen.



  • Braunstein schrieb:

    Solange es um PODs geht wird es wohl kaum einen Unterschied machen.

    Darauf würde ich mich nicht verlassen. Nur daß es meistens funktioniert, garantiert nicht, daß irgendeine unerwartete Situation (ein subtiler Unterschied im Allokationsverhalten von new und malloc, eine Änderung der Implementation beim Update auf eine neuere Version, ...) plötzlich alles kaputtmacht.



  • Ich habe auch nicht gesagt, dass man sich darauf verlassen soll.
    Vielleicht ist meine Aussage nicht exakt genug gewesen. Deswegen nochmal zum Protokoll.
    Gib niemals Speicher den du mit new geholt hast mit free wieder frei.



  • Braunstein schrieb:

    Ich habe auch nicht gesagt, dass man sich darauf verlassen soll.

    Ich habe auch nicht gesagt, daß du gesagt hättest... ach, du weißt schon 😉

    Ich wollt's nur klarstellen, damit bei Lesern des Threads nicht die Idee aufkommt, das wäre irgendwie okay.



  • Ich glaube wir sind uns jetzt einig. 🙂


Anmelden zum Antworten