Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wo ist der Speicherüberlauf?? (https://www.delphipraxis.net/103851-wo-ist-der-speicherueberlauf.html)

rollstuhlfahrer 22. Nov 2007 17:37


Wo ist der Speicherüberlauf??
 
HI,

ich hab jetzt ein Programm geschrieben, dass ein Bild übertragen soll. Jetzt ist mir im Langzeittest aufgefallen, dass das Programm unmengen Arbeitsspeicher braucht. Nach der Komprimierung nach JPEG ist die Speicherübernutzung zwar nicht weg, aber immer noch da. Nach rund 100 Zugriffen beendet sich das Programm wegen Speicherüberlauf. Ich hab schon versucht alle Variablen zu zerstören, aber das hilft nicht.

Quellcode:
Delphi-Quellcode:
    Bild := TBitmap.Create;
    MS := TMemoryStream.Create;
    MakeScreenShot(Bild);

    JPEGBild := TJPEGImage.Create;
    JPEGBild.CompressionQuality := 90;
    JPEGBild.Assign(Bild);
    JPEGBild.Compress;

    Bild.Destroy;

    JPEGBild.SaveToStream(MS);
    JPEGBild.Destroy;

    MS.Write('ENDE', 4);
    MS.Position := 0;

    ServerSocket1.Socket.Connections[0].SendStream(MS);

    MS.Clear;
    MS.Destroy;
Wie sich wohl ahnen lässt, ist das ein Schnipsel aus einer ServerSocket1-ClientRead Prozedur.

Bild: TBitmap(lokal);
MS: TMemoryStream(lokal);
JPEGBild: TJPEGImage(lokal);

Vielen Dank im Vorraus für eure Hilfe
rollstuhlfahrer

quendolineDD 22. Nov 2007 17:39

Re: Wo ist der Speicherüberlauf??
 
Rufe mal anstatt Variable.Destroy --> Variable.Free auf.
Bei Destroy wird afaik kein Speicherplatz freigegeben...

Apollonius 22. Nov 2007 17:42

Re: Wo ist der Speicherüberlauf??
 
Da denkst du falsch, Lars. Free ruft Destroy auf, falls die Variable nicht nil ist.
@rollstuhlfahrer: Dürfen wir auch MakeScreenShot sehen?

sirius 22. Nov 2007 17:43

Re: Wo ist der Speicherüberlauf??
 
Zitat:

Zitat von quendolineDD
Rufe mal anstatt Variable.Destroy --> Variable.Free auf.
Bei Destroy wird afaik kein Speicherplatz freigegeben...

Doch. Nur bei Destroy wird Speicher freigegeben.

Wie schnell hintereinander rufst du denn den Code auf?

dominikkv 22. Nov 2007 17:43

Re: Wo ist der Speicherüberlauf??
 
Zitat:

Zitat von quendolineDD
Rufe mal anstatt Variable.Destroy --> Variable.Free auf.
Bei Destroy wird afaik kein Speicherplatz freigegeben...

doch... nur free überprüft ob das überhaupt notwendig ist (ob die instanz also wirklich existiert) und ruft dann destroy auf.
noch besser ist natürlich FreeAndNil(Klasse), dort wird der Objektzeiger noch zusätzlich auf NIL gestellt.

wie sieht MakeScreenShot aus?

jbg 22. Nov 2007 17:48

Re: Wo ist der Speicherüberlauf??
 
Zitat:

Zitat von quendolineDD
Bei Destroy wird afaik kein Speicherplatz freigegeben...

Du meinst wohl "afaidk". Destroy gibt den Speicher auch frei. Nur soll man Destroy nicht direkt aufrufen und das schon seit Delphi 1. Das steht so auch in der Hilfedatei. Für die genauen Gründe kann man sich ja mal Allen Bauers (CodeGear) Blog anschauen.

Beim Code fehlen nicht nur die try/finally Blöcke, sondern wird auch unnötig der Stream geleert bevor er freigegeben wird. Das erinnert mich an folgenden Code:
Delphi-Quellcode:
var
  List: TStringList;
begin
  List := TStringList.Create;
  List.Clear; // Die Liste könnte ja schon nach dem Erzeugen gefüllt sein, man weiß ja nie :-)
  ...
  List.Clear; // Es könnte ja sein, dass der Destruktor nur zur Gaudi vorhanden ist.
  List.Free;
end;

rollstuhlfahrer 22. Nov 2007 19:37

Re: Wo ist der Speicherüberlauf??
 
klar dürft ihr makescreenshot sehen. er ist von dsdt.

Delphi-Quellcode:
procedure MakeScreenShot(const ATarget: TBitmap);
var
  DesktopDC: HDC;
begin
  DesktopDC := CreateDC('DISPLAY', nil, nil, nil);
  try
    ATarget.PixelFormat := pfDevice;
    ATarget.Width := Screen.Width;
    ATarget.Height := Screen.Height;
 
    BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY);
  finally
    DeleteDC(DesktopDC);
  end;
end;
rollstuhlfahrer

PS: Ich hab jetzt öfter mit dem Fehler: 'Ungültige Zeigeroperation' zu tun

Bernhard Geyer 22. Nov 2007 19:47

Re: Wo ist der Speicherüberlauf??
 
Ich würde einfach mal FastMM reinhängen um zu sehen was der sagt. Evtl. ist ja der Speicherverlust ganz woanders.

quendolineDD 22. Nov 2007 19:55

Re: Wo ist der Speicherüberlauf??
 
Hast du eventuell irgendwo ein Array, dessen größte du andauernd änderst?

rollstuhlfahrer 23. Nov 2007 15:27

Re: Wo ist der Speicherüberlauf??
 
mal ne ganz dumme frage: wie installiere ich fastMM?

@quendolineDD: In dem Programm gibt es kein einziges Array.

rollstuhlfahrer


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr.
Seite 1 von 2  1 2      

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