AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wo ist der Speicherüberlauf??

Ein Thema von rollstuhlfahrer · begonnen am 22. Nov 2007 · letzter Beitrag vom 23. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#1

Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 17:37
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
Bernhard
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 17:39
Rufe mal anstatt Variable.Destroy --> Variable.Free auf.
Bei Destroy wird afaik kein Speicherplatz freigegeben...
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 17:42
Da denkst du falsch, Lars. Free ruft Destroy auf, falls die Variable nicht nil ist.
@rollstuhlfahrer: Dürfen wir auch MakeScreenShot sehen?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 17:43
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?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 17:43
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?
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 17:48
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;
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#7

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 19:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 19:47
Ich würde einfach mal FastMM reinhängen um zu sehen was der sagt. Evtl. ist ja der Speicherverlust ganz woanders.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Wo ist der Speicherüberlauf??

  Alt 22. Nov 2007, 19:55
Hast du eventuell irgendwo ein Array, dessen größte du andauernd änderst?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#10

Re: Wo ist der Speicherüberlauf??

  Alt 23. Nov 2007, 15:27
mal ne ganz dumme frage: wie installiere ich fastMM?

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

rollstuhlfahrer
Bernhard
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz