Char-Array wieder freigeben



  • Hallo,

    ich habe ein Problem ein mit new erzeugtes Char-Array wieder zu zerstören:

    #include <iostream>
    #include <windows.h>
    
    int main()
    {
    	Sleep(5000);
    	char* tString = new char[10240];
    	Sleep(5000);
    	delete tString;
    	Sleep(5000);
    	return(0);
    }
    

    Das zeigt bei mir unter XP im Taskmanager den Prozess zunächst mit 848kB, dann mit 860kB, aber da bleibt er dann bis zum Ende des Programms.
    Warum wird mein Speicher nicht mehr freigegeben? Zerstöre ich nur den Pointer?
    Wie gehts denn richtig?

    Vielen Dank,
    David



  • delete mit delete[] verwechselt.



  • delete[] pString

    Devil



  • Ich glaube kaum, dass es daran liegt 🙂



  • Wenn man's sich genau ansieht habe ich das auch nie gesagt 🤡



  • Also delete[] funktioniert auch nicht (sollte es das den???)
    Und was ändert sich, wenn ich meine Variable pString anstatt tString nenne?



  • zu new[] gehört immer ein delete[]
    und das p war nur ein Tippfehler.



  • CGI-BIN: Du solltest nicht denken, dass new direkt Speicher vom Betriebssystem anfordert. new geht auf den sog. Freispeicher, das ist ein Pool von freien Speicherblöcken, die unter der Kontrolle deines Programmes stehen. Wenn du mit new einen Block anforderst, versucht die Freispeicherverwaltung einen freien Block passender Größe zu finden. Ist das nicht möglich, wird der Freispeicher vergrößert, indem vom Betriebssystem mehr Speicher angefordert wird. Wenn du mit delete einen Block freigibst, wird er einfach wieder dem Pool freier Blöcke zugefügt, aber (normalerweise) nicht dem BS zurückgegeben.



  • Heißt das also, es ist alles in Ordung so wie ich das mache (wenn mit delete[]) obwohl es nicht angezeigt wird?
    Aber im Pointer ist doch nur die Adresse des ersten Zeichens gespeichert, wie weiß der delete Befehl, wieviele Stellen freigegeben werden müssen?



  • Heißt das also, es ist alles in Ordung so wie ich das mache (wenn mit delete[]) obwohl es nicht angezeigt wird?

    Ja. Kannst ja mal probieren (allerdings ohne Gewähr), nach dem delete[] gleich nochmal die gleiche Größe mit new[] anzufordern. Der alte freigegebene Block müsste gleich wieder benutzt werden, so dass die Größe nicht nochmal ansteigt.

    Aber im Pointer ist doch nur die Adresse des ersten Zeichens gespeichert, wie weiß der delete Befehl, wieviele Stellen freigegeben werden müssen?

    Das bleibt der Kunst des Compilerbauers überlassen 🙂 Eine Möglichkeit wär, die Größe vor dem Zeiger abzulegen, den er dir gegeben hat.



  • Super, Danke. Es geht genau so, wenn man direkt nochmal anfordert, wird's nicht mehr größer.


Anmelden zum Antworten