Hallo,
vielleicht hier nicht ganz richtig aber evtl. kennt sich
jemand mit Speicherverwaltung unter Windows 2000 aus.
Wenn realloc() einen Nullzeiger zurückliefert, ist der Heap
voll, so stehts geschrieben. Da Windows angeblich eine
dynamische Speicherverwaltung hat und nie voll wird (halte ich
für ein Gerücht) wie kann es dann sein, daß ich einen
Nullzeiger zurückbekomme? (Speicher doch voll…)
Sag niemals nie! :o)
Da Windows ein 32Bit Betriebssystem ist, kann theoretisch 2^32Byte pro Prozess verwalten, das sind 4GByte. Spätestens hier, vermutlich aber wesentlich früher, wird dir der Heapspeicher ausgehen.
Den Heap musst du dir als ein Stück Speicher vorstellen, wenn du ihn vergößerst, so wird hinten etwas angehängt. Der Heap an sich hat keine Lücken und ist linear. Beim AUfruf von alloc sucht sich die Appliktion ein Stück freien Speicher aus dem Heap. Wenn du alloc mehrmals aufrufst, so werden deine Speicherbereiche wahrscheinlich direkt hintereinandere liegen (eine Garantie dafür gibt es nicht). Mit realloc versucht du dein auf dem Heap liegenden Speicher zu vergrößern. Das geht nur, wenn hinter deinem Speicher noch etwas frei ist, liegt dort ein anderer Block, so wird ein völlig neuerer Speicherblock angefordert, der entsprechend die neue größe hat. realloc kopiert dabei den alten Inhalt in den neuen Bereich.
Rufst du immer wiede realloc auf, so fragmentiert dein Speicher, d.h. du hinterlässt eine Lücke und reservierst am Ende des Heaps neuen Speicher. Realloc schläg fehl, sobald keine Lücke mehr existiert, die deinen Speicher-Bedarf befriedigt. Ähnlich sieht das bei malloc aus.
Im worst case allokierst du zig mal ein Byte, da malloc aber immer etwas mehr reserviert, kannst du hiermit deinem kompletten Heap belegen. Gibt es keinen freien Heap-Speicher mehr, geben dir malloc/realloc einen 0-Zeiger zurück.
Man geht von theoretisch unbegrenztem Speicher aus, da kein normale Applikation mehrere GB RAM in Anspruch nimmt. Sollte deine Applikation hier aus der Reihe schlagen, solltest du schleunigst analysieren, wo der Speicher bleibt. Entweder ist deine Applikation sehr Speicherlastig (bedingt durch ein falsches Design), oder sie hat einen Fehler.
Gruß Markus