mittels malloc den heap alloziieren bis return NULL



  • in einer schleife sollen solange 4MB auf dem heap alloziiert werde bis NUll zurückgegeben wird!

    int main(void)
    {
    int *p;
    
    do
    {
    
     p=(int *)malloc(4000000);
    
    }
    while( p != NULL);
    
    printf("heap voll");
    free(p);
    getchar();
    }
    

    ist nur ein auszug des codes!

    im task manager sehe ich wieder der speicher sich füllt, aber er bricht nicht ab, sprich NULL wird nicht zurückgegeben.
    er alloziiert doch bei jedem schleifendurchlauf immer wieder 4 MB oder?
    dabei zeigt p jedesmal auf die anfangsadresse dieses jeweiligen 4 MB bereiches?
    was mache ich falsch?



  • das programm läuft ohne deine genannten probleme, mit dem malloc ists klar...
    wenn dein ramspeicher voll ist lagert dein pc einen teil auf die festplatte



  • Wenn du das im Release läufen lässt, sollte der Speicher in null-komma-nix voll sein. Besser gesagt: der Adressraum wird "voll". Ausgenommen mal ein 64 Bit System, da könnte es eher lange dauern, vorausgesetzt das Swapfile ist ausreichend gross.

    Wenn du den Code aber im Debug laufen lässt wird es ewig dauern, da im Debug der "frische" Speicher meist mit einem speziellen Pattern (0xCD bei MSVC) angefüllt wird. Dadurch muss der virtuelle Speicher wirklich "hereingebracht" werden, also mit echtem RAM "unterlegt". Das führt dann zu heftigem Paging, da irgendwann das RAM voll ist, und die ganzen älteren 0xCDCDCDCD erstmal ins Pagefile geschrieben werden müssen. Kann dann recht lange dauern bis malloc mal 0 zurückliefert.



  • und was mache ich jetzt wenn ich erreichen will das er abbricht sobal das ram voll ist?



  • Geht eben nicht, weil du nicht merken kannst, wann der Speicherplatz auf virtuellem (statt wirklichem) RAM alloziert wird. Du kannst aber nachschauen, wieviel Arbeitsspeicher frei ist und entsprechend viel holen, dann ist er auch voll (obwohl dann glaubich auch ein großer Teil auf der Festplatte ausgelagert wird, jedenfalls unter Windows).



  • "task manager" klingt nach windows. das programm sollte eigentlich maximal 2 gb ram allozieren dürfen.



  • Du kannst Dir aber die Speicherinfos über ne WinAPI-Funktion (GlobalMemoryStatusEx) holen. Oder Du läuscht an Deinem PC-Gehäuse, wenns permanent rattert, weißte das Deine HD in Aktion tritt 😃 .
    PS:
    Das:

    free(p);
    

    bringt auch nit mehr viel *g*.



  • CodeFinder schrieb:

    PS:
    Das:

    free(p);
    

    bringt auch nit mehr viel *g*.

    physikalischer speicher war 4xx Mb frei, die waren ruckzuck weg. die auslagerungsdatei ist über 1.1 gig gewachsen!hm

    wie löse ich denn dann die aufgabe?

    Dynamische Speicherverwaltung
    Testen Sie den Speicherausbau Ihres Rechners.
    Schreiben Sie ein Programm, mit dem Sie solange in einer Schleife jeweils 4 Mbyte
    Speicher auf dem Heap alloziieren bis das System mit dem Rückgabewert NULL zeigt,
    dass der mögliche Speicher aufgebraucht ist.
    Speichern Sie die Pointer in einem Array und geben Sie den Speicher anschliessend
    wieder geordnet frei. Geben Sie bei jeder Allokation/Deallokation auf der Konsole den
    Index der Operation und die Adresse des zugehörigen Pointers aus.
    Wieviele Blöcke von 4 MB können Sie alloziieren? Bitte begründen Sie die Grösse.
    Gibt es eine prinzipielle Grenze?
    Beobachten Sie im Task-Manager die Zunahme/Abnahme der Speichernutzung.
    Stimmen die Angaben im Task-Manager mit Ihrer eigenen Abschätzung überein?
    Sie sehen unterschiedliche Geschwindigkeiten der Zuweisung von Speicher. Warum?
    Stimmt der Übergang mit Ihrer Kenntnis über den Speicherausbau des Systems überein?



  • and push
    habe die aufgabe mal angehängt!!



  • Was hast du denn fürn OS?

    Bei mir (Windows XP) bricht das Programm "sofort" ab, weil der Speicher voll
    ist.

    btw:
    Gut dass, du wenigstens 4MB von den XXXMB wieder frei gibst 😃



  • wanderameise schrieb:

    habe die aufgabe mal angehängt!!

    Wo ist denn die Frage ? Poste mal was Du schon hast.



  • Oh...

    Das delete ist ja noch effektiver, fällt mir gerade auf...
    delete 0 😉



  • habe nur diesen teil code

    int main(void)
    {
    int *p;
    
    do
    {
    
     p=(int *)malloc(4000000);
    
    }
    while( p != NULL);
    
    printf("heap voll");
    free(p);
    getchar();
    }
    

    aber er bricht nicht ab nachdem der RAM voll ist sondern schreibt wie es scheint auf der festplatte weiter!meine frage war, wann er denn nun abbricht und wie man herausfindet wieviel er insgesamt schreibt!



  • Ähm... Irgendwie... Hast du unsere Beiträge nicht gelesen?

    Ich denke mal, er bricht ab, wenn die Maximal-Größe der Auslagerungsdatei erreicht ist.
    Und wieviel er schreibt? Wie denn "schreibt"? Meinst du, wieviel RAM du nun gefordert hast? Mach dir eine Variable vor die do-Schleife und zähl sie in jedem Durchlauf um 4000000 hoch.


Anmelden zum Antworten