Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicher freigeben TBitmap. Aber wann? (https://www.delphipraxis.net/79353-speicher-freigeben-tbitmap-aber-wann.html)

BrotherLui 20. Okt 2006 17:51


Speicher freigeben TBitmap. Aber wann?
 
Hallo,

ich habe gelesen mann muss den Speicher von Objekten wieder frei geben wenn man sie nicht mehr braucht. Sonst entstehen Speicherlöcher.

Problem:
Mein Programm beendet sich nach gewisser Zeit von selbst. Je schwächer der Rechner desto schneller. Daher die Vermutung es könnte hier dran liegen. Ich lade zu beginn des Programms Bilder in ein Array of TBitmap und gebe den Speicher nicht wieder frei.

Delphi-Quellcode:
var
  bilder: array[0..36] of TBitmap;
begin
...
for i:=0 to anzahl do
begin
   bilder[i] := TBitmap.Create;
   bilder[i].LoadFromFile(inttostr(i)+'.bmp');
end;
...
end;
so jetzt benötige ich aber das array die komplette Laufzeit bis das Programm beendet wird, da ständig Bilder verglichen werden.


Folgende Fragen:

1. Wann soll ich jetzt den Speicher freigeben? (bilder[i].free)
2. Wenn ich es nicht tue entsteht dann ein Speicherleck?
3. Gilt das gleiche auch für InI - Objektte? Von denen hab ich nämlich auch noch.


Vielen Dank

mkinzler 20. Okt 2006 17:53

Re: Speicher freigeben TBitmap. Aber wann?
 
Wenn du die Bilder, die gesamte Laufzeit des Programmes brauchst, darfst du sie erst bei Programmende wieder freigeben (.onClose)

turboPASCAL 20. Okt 2006 17:57

Re: Speicher freigeben TBitmap. Aber wann?
 
Zitat:

Sonst entstehen Speicherlöcher.
Eher eine Speicherverschwendung bis zun neustart des PC's... ;)

Zitat:

Wann soll ich jetzt den Speicher freigeben?
Na, wenn du sie nicht mer brauchst.

Zitat:

Wenn ich es nicht tue entsteht dann ein Speicherleck?
siehe oben

Zitat:

Gilt das gleiche auch für InI - Objektte?
ja.

Im Grunde für alles was du mit ....Create erstellst.

BrotherLui 20. Okt 2006 18:02

Re: Speicher freigeben TBitmap. Aber wann?
 
Danke für die schnellen Antworten.

Also dann liegt das Problem woanders?

Denn wenn ich den Speicher erst im onclose wieder freigebe bringts ja nichts. Bis dahin ist er ja schon abgeschmiert! (Wie gesagt bei langsamen Rechnern dauerts so 20 Minuten bei schnellen mehrere Stunden.)

Seh ich das richtig?

Christian Seehase 20. Okt 2006 18:05

Re: Speicher freigeben TBitmap. Aber wann?
 
Moin BrotherLui,

Zitat:

Zitat von BrotherLui
Also dann liegt das Problem woanders?

anzunehmen.
Vielleicht solltest Du das Programm mal mit Bei Google suchenMemProof checken.

Muetze1 20. Okt 2006 18:07

Re: Speicher freigeben TBitmap. Aber wann?
 
Ja, ich denke da kann ich dir vorsichtig zustimmen. Aber ich habe eher die Vermutung, dass du beim "ständigen vergleichen" der Bilder welche nicht frei gibst. Kannst du diesen Teil des Quellcodes mal zeigen?

BrotherLui 20. Okt 2006 18:16

Re: Speicher freigeben TBitmap. Aber wann?
 
hier werden die Bilder verglichen

Delphi-Quellcode:
function Istgleich(bm1,bm2:TBitmap):single;
var
        x,y,br:integer;
        p1,p2:PByteArray;
begin
  try
        result:=-1;
        br:=breitenwert(bm1);
        if br < 1 then exit;
        result:=0;
        if (bm1.width<>bm2.width)or(bm1.height<>bm2.height)or(bm1.pixelformat<>bm2.pixelformat)then exit;
        for x:=0 to bm1.height-1 do
        begin
                p1:=bm1.scanline[x];
                p2:=bm2.scanline[x];
                for y:=0 to br do if p1[y]<>p2[y] then exit;
        end;
    except ShowMessage('Fehler'); end;
        result:=1;
// Muss ich vielleicht hier die bm1 und bm2 freigeben?
end;
der Aufruf:
Delphi-Quellcode:
if (istgleich(scrshot,bilder[i]) = 1) then ...
scrshot.free;
Danke für die Hilfe

Muetze1 20. Okt 2006 18:21

Re: Speicher freigeben TBitmap. Aber wann?
 
hmm, ok, scrshot wird ja freigegeben. (ist also ok)
Sonst noch irgendwelche Instanzen/Klassen im Programm?

BrotherLui 20. Okt 2006 18:26

Re: Speicher freigeben TBitmap. Aber wann?
 
Zitat:

Sonst noch irgendwelche Instanzen/Klassen im Programm?
Ja bestimmt. Ich werd die alle mal penibel durchgehen. Ich weiß jetzt auch ungefähr was ich wissen wollte und auf was ich achten muss.

Vielen Dank nochmal (Muetze1)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 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