Markus Schulz wrote:
Am Donnerstag, 14. Februar 2008 schrieb Reinhold Plew: [...]> Wenn du die Schleife länger laufen lässt "verlässt" du irgendwann > den allozierten Heap Bereich deines Programmes, dann landest du in > einer nicht allozierten Page und generierst damit ein Page Fault. Und genau da liegt die Ursache für den Effekt, den Martin sieht. Wenn das Programm mit der Schleife korrekt laufen würde, kommt es zu einem Page Fault, wenn der Speicher nicht mehr ausreicht. In der zweiten Version, ohne Schleife, reicht der verfügbare Speicher anscheinend aus, um die Daten aufzunehmen. Man muss nicht immer explizit Speicher allozieren, um mit Variablen arbeiten zu können (ich weiss, schlechter Programmierstil und sollte verboten werden).Naja, wenn du in der "Ohne-Schleife" Version Zugriffe von 0..140000 hinschreiben würdest, würde er auch segfaulten wie die Schleife von 0..140000. Der Heap dieses Testprogramms ist ~128kb groß, sobald also der Zugriff diesen Bereich verlässt gibt's 'nen SegFault.
Naja, hatte ich ja oben geschrieben, nur etwas salopp ausgedrückt.
Ein Page-Fault kommt genau dann zustande wenn die berechnete Adresse auf die zugegriffen wird nicht dem Prozess gehört, ob der Speicher via malloc/new/.. alloziert wurde oder nicht ist dabei egal.
ACK
Natürlich ist es unsauber und absolut gefährlich auf Speicher den man nicht alloziert hat zuzugreifen und darauf zu vertrauen das er noch/schon verfügbar ist.
ACK Gruss Reinhold