Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Stackoverflow bei Records über 1000KB bei Streams


O'rallY - Mo 24.02.03 18:46
Titel: Stackoverflow bei Records über 1000KB bei Streams

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TMain.Button1Click(Sender: TObject);
var
   fs: TFileStream;
   Buddys: array[0..99] of TBuddy; //TBuddy ist 21488 Bytest groß
begin

   fs := TFileStream.Create(IncludeTrailingBackslash( ExtractFilePath( ParamStr(0))) + 'test.txt', fmCreate);
   fs.Write(Buddys, SizeOf(Buddys));
   fs.Free;
end;


Wenn ich fs.Write... auskommentiere erscheint der Fehler nicht. Der Fehler erscheint aber auch nur, wenn Buddys ca. unter 1000KB groß ist.
Woran liegt das?
Den gleiche Fehler bekomme ich auch bei Typisierten Dateien.


AndyB - Mo 24.02.03 18:54

Der Stack ist auf max. 1 MB begrenzt, damit ausgebrochene Rekursionen abgefangen werden können. Wenn du nun eine lokale Variable deklarierst, so wird diese auf dem Stack abgelegt, was den Stackspeicher verringert.
Der Ausweg ist ein dynamisch alloziierter Speichern oder gleich ein dynamisches Array. Dieser wird vom restlichen Arbeitsspeicher genommen und unterliegt somit nicht dieser Einschränkung.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TMain.Button1Click(Sender: TObject); 
var 
   fs: TFileStream; 
   Buddys: array of TBuddy; //TBuddy ist 21488 Bytest groß 
begin 
  SetLength(Buddys, 1024 * 1024);

  fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'test.txt', fmCreate); 
  try
    fs.Write(Buddys[1], Length(Buddys) * SizeOf(TBuddy)); 
  finally
    fs.Free; 
  end;
end;



ExtractFilePath enthält bereits den abschließenden Backslash


O'rallY - Mo 24.02.03 20:57

Ah, danke! Wieder was gelernt. Ich meine, das hab ich schonmal irgendwo gelesen. Aber, naja, das Alter. Mit 15 verlässt einen das Gedächtnis ja schon sehr :wink:
AndyB hat folgendes geschrieben:
ExtractFilePath enthält bereits den abschließenden Backslash

Jo, stimmt eigentlich. Ist irgendwie ne schlechte Angewohnheit von mir :mrgreen: