Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EOutOfMemory (https://www.delphipraxis.net/38023-eoutofmemory.html)

Die Muhkuh 13. Jan 2005 17:46


EOutOfMemory
 
Hi,

ich bekomme bei diesem Code eine EOutOfMemory-Exception:

Delphi-Quellcode:
 
function TfDoc.ReadStringFromStream(F: TStream): string;
var
  aStrLen: Integer;
begin
  F.ReadBuffer(aStrLen, SizeOf(Integer));
  SetLength(Result, aStrLen); //<<< Da kommt ein Fehler
  if aStrLen > 0 then
    F.ReadBuffer(Pointer(Result)^, aStrLen);
end;

{Procedure blablabla}

     ReadStringFromStream(aStream);
      FName := ReadStringFromStream(aStream);
      if FName <> ExtractFileName(FileName) then
      begin
        MessageBox(Handle,
          'Der Dateiname wurde seit dem letzten Speichern verändert.',
          'Hinweis', MB_OK);

        Modified := true;
        IsMod := true;
      end
      else
        IsMod := false;
      FAuthor := ReadStringFromStream(aStream);
      FDate := ReadStringFromStream(aStream);
      FComment := ReadStringFromStream(aStream);
      Temp := ReadStringFromStream(aStream);
      aSStream := TStringStream.Create(Temp);
      case FEditor of
        etRichText: RichEdit.Lines.LoadFromStream(aSStream);
        etCode: Code.Lines.LoadFromStream(aSStream);
      end;

      FIsDC := true;
Weis jemand warum?

tommie-lie 13. Jan 2005 17:48

Re: EOutOfMemory
 
Schonmal im Debugger überprüft, wie groß aStrLen nach dem Einlesen ist?

Die Muhkuh 13. Jan 2005 17:53

Re: EOutOfMemory
 
Hi,

ich glaube es lag an dem Dokument das ich geladen habe. Ich hab jetzt mal ein anderes geladen, dort gings auf Anhieb.

In welchem Fall tritt diese Fehlermeldung auf?

dizzy 13. Jan 2005 17:57

Re: EOutOfMemory
 
Wenn in aStrLen eine Zahl > High(Integer) steht. Für gewöhnlich wären das dann (als Integer gesehen) negative Werte, die dann umklappen dürften.
Ein Prozess darf imho nicht mehr als 2GB allozieren.

\\edit: Probier mal "SetLength(Array, -1);"
Mich würde mal interessieren was dabei raus kommt. (Hab grad kein Delphi zur Hand)

tommie-lie 13. Jan 2005 18:13

Re: EOutOfMemory
 
Zitat:

Zitat von Spider
In welchem Fall tritt diese Fehlermeldung auf?

Was ist denn an "Out of Memory" so schwer zu verstehen? Wenn du mehr Speicher allokieren willst als dir zur Verfügung steht (inklusive Paging).

Zitat:

Zitat von dizzy
\\edit: Probier mal "SetLength(Array, -1);"
Mich würde mal interessieren was dabei raus kommt. (Hab grad kein Delphi zur Hand)

ERangeError

dizzy 13. Jan 2005 19:06

Re: EOutOfMemory
 
Zitat:

Zitat von tommie-lie
ERangeError

Na gut :stupid:

Aber auch wenn man's ohne Bereichsprüfung kompiliert!? Und evtl. dann auch mal mit einer Variablen:
Delphi-Quellcode:
var
  i: Integer;
begin
  i := -1;
  SetLength(Array, i);
end;
:?:

tommie-lie 13. Jan 2005 19:13

Re: EOutOfMemory
 
Zitat:

Zitat von dizzy
Aber auch wenn man's ohne Bereichsprüfung kompiliert!?

Ich habe es ohne Range-Checking kompiliert ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz