Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:35
Okay, die ist nicht der Schuldige. Die Deklaration von Sdatensatz wäre dann interessant, weil wenn das zu groß ist, könnte in der Tat ein 300 Elemente langes Array davon den Stack überfordern. In dem Fall wäre ein Umbau auf ein dynamisches Array ggf. sinnvoll, die liegen nämlich dann auf dem Heap.

Delphi-Quellcode:
const
 BufferSize = 300;

procedure TForm51.SpeedButton3Click(Sender: TObject);
var
  Buffer: array of Sdatensatz; // Grenzen entfernt -> so ist es ein dynamisches Array
  i, StartRecord, EndRecord, Max: Integer;
begin
  SetLength(Buffer, BufferSize); // Reserviert 300 Plätze, so dass es von aussen genau so wie das alte Array aussieht
 ...
Lokale Variablen, sprich alles unter dem "var" der procedure landet erstmal pauschal auf dem Stack. Da Delphi bei einem dynamischen Array aber noch nicht weiss wie viel Speicher dafür zu veranschlagen ist, belegt es nur 4 Byte (einen Pointer) auf dem Stack, und die eigentlichen Array-Elemente werden nachher mit SetLength() im Heap erzeugt. Bei deinem statischen Array (also mit fester Längenangabe direkt bei der Deklaration) versucht Delphi das ganze Teil auf den Stack zu quetschen, der standardmäßig mit 1MB für sowas recht knapp ist.
Man könnte jetzt natürlich auch in den Projektoptionen die Stackgröße aufbohren wie Hulle, das ist aber fast nie nötig, und auch nicht ganz sinnvoll.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat