Entwickler-Ecke
Sonstiges (Delphi) - Speicherplatz freigeben vom Returnwert
AlienX - So 18.08.02 17:42
Titel: Speicherplatz freigeben vom Returnwert
Ich wusste nicht genau, wo das reinpasst, deswegen schreib ich es in "Sonstiges".
Ich hatte folgende Funktion:
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 - So 18.08.02 20: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....
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 - Mi 21.08.02 13: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 - Mi 21.08.02 15:02
Hallo AlienX!
Das GetBitmap muss nicht freigegeben werden. Anders könnte man den Code so schreiben:
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.
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 - Mi 21.08.02 15:06
Okay, danke für die Erklärung. Ich dachte zu jedem Create gehört auch ein Free. :roll:
Tino - Mi 21.08.02 15: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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!