Autor Beitrag
AlienX
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 18.08.02 18:42 
Ich wusste nicht genau, wo das reinpasst, deswegen schreib ich es in "Sonstiges".

Ich hatte folgende Funktion:
ausblenden Quelltext
1:
2:
3:
4:
5:
function TCharacter.GetBitmap: TBitmap;
begin
  GetBitmap := TBitmap.Create;
  GetBitmap.LoadFromFile('guy.bmp');
end;


Diese ist zwar sehr unpraktisch, weil das Bild immer wieder geladen wird, aber ich hatte es auch nur wegen der Einfachheit in ein Testprogramm eingebaut.

Nach ein paar Minuten stürzte der Rechner ab, weil immer mehr Speicher belegt wurde. Ich hab das Bild dann auch global gespeichert und mit einem Konstruktor initalisiert und mit einem Destruktor freigegeben, was natürlich ohne Probleme funktioniert.

Trotzdem würde mich interessieren, wie man das Problem löst, wenn man das Bild nicht global speichern will, also den Speicher in derselben Funktion wieder freigeben müsste.
Denn auch wenn ich eine Buffer Variable verwende und GetBitmap dann mit dem Buffer gleich setze, kann ich danach den Speicher, der für das BufferBild verwendet wird, nicht wieder freigeben
Fanatics
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 18.08.02 21:46 
Titel: wer entscheidet ob das Objekt noch gebraucht wird ?!
da du eine funktion geschrieben hast, die ein objekt erzeugt und an den aufrufer übergibt(zumindest den zeiger darauf...) musst der aufrufer auch dafür sorgen, dass das objekt wieder zerstört wird....
ausblenden Quelltext
1:
2:
3:
bitmap := InstanzVonTCharacter.GetBitmap;
....
bitmap.free;
damit müsste der speicher wieder freigegeben werden....


...aber hast du dir mal überlegt eine imagelist zu verwenden ? das bild wird einmal mitkompiliert und ist immer zur verfügung und man muss nicht jedesmal eine neue instanz erzeugen....

gruß

Fanatics
AlienX Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 21.08.02 14:55 
Wie ich "Bitmap" wieder freigebe ist mir klar, mir geht es um das "GetBitmap", dass in der Funktion GetBitmap createt wird, aber nicht wieder freigegeben wird.
Günter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 21.08.02 16:02 
Hallo AlienX!

Das GetBitmap muss nicht freigegeben werden. Anders könnte man den Code so schreiben:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function TCharacter.GetBitmap : TBitmap;
var
  aBitmap : TBitmap;
begin
   
  aBitmap := TBitmap.Create;
  aBitmap.LoadFromFile('xyz.bmp');

  Result := aBitmap;  
end;


aBitmap ist ein Pointer auf ein Bitmap-Object. Nach dem verlassen der
Funktion existiert aBitmap nicht mehr.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
...
  bitmap := TCharacter.GetBitmap;

  {bitmap ist jetzt der gleiche Pointer wie Result}
  
  bitmap.Free;
  bitmap := nil;
...


Wenn du jetzt bitmap Freigibst, wird das Objekt, das von der Funktion erzeugt wurde Freigegeben, und somit der Speicher, wie Fanatics gesagt hat, da es sich um ein und das Selbe Objekt handelt.

Gibt man aBitmap in der Funktion frei, würde ein Zeiger auf ein nicht mehr Existierendes Object zurückgegeben. Schlimmer noch, der Zeiger wäre nicht nil, also würde ein 'Assigned(bitmap)' true zurückliefern. Jeglicher Vorgang mit Bitmap würde dann zu einer Exception führen.

Sollten dennoch "Memory-Leaks" auftreten wird vielleicht ein anderes Objekt nicht freigegeben.
AlienX Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 21.08.02 16:06 
Okay, danke für die Erklärung. Ich dachte zu jedem Create gehört auch ein Free. :roll:
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 21.08.02 16:15 
AlienX hat folgendes geschrieben:
Ich dachte zu jedem Create gehört auch ein Free

So sollte es auch sein!

Nur sollte man ein Objekt welches man erstellt hat auch auf der gleichen "Ebene" wieder freigeben. Mit Ebene meine ich zum Beispiel am Anfang einer Procedure und am Ende dieser Procedure oder im Constructor und im Destroctor...

Nur mit Deiner Procedure ist das nicht möglich. Deshalb würde ich diese so umschreiben das als Parameter ein schon erstelltes Bitmap erwartete wird.

Gruß
TINO