Einzelnen Beitrag anzeigen

Benutzerbild von BMI
BMI

Registriert seit: 16. Jul 2010
58 Beiträge
 
Delphi 2 Desktop
 
#1

Memoryleak durch Erstellen v. Objekt in Function()?

  Alt 1. Mär 2018, 17:12
Delphi-Version: 5
Hi,

eigentlich dachte, ich das geht ganz einfach.
Naja, mittlerweile bin ich mir da nicht mehr sicher, ob das nicht ein unentdecktes Speicherproblem gibt.

Delphi-Quellcode:
function bildbearbeiten(EingangsImage: Timage): Tbitmap;
var a, b: Integer;
  imo: Tbitmap;
  pico: TPicture;
begin
  imo := Tbitmap.create;
  pico := TPicture.create;
  pico := EingangsImage.Picture; // jaa, intelligente Bezeichner ...
imo := pico.picture.bitmap
       {...} // Bearbeiten des Bildes
  result := imo; // übergabe als Referenz

// ACHTUNG, folgender FEHLER:
   pico.free; //<< kille ich die,
   imo.free; // habe ich eine Exception
end; // Bild bearbeiten
Hier knallt's, weil die Referenz fehlt. Aber ich dachte die würde solange bestehen bleiben, bis an result übergeben und die Function verlassen - und schließlich beim Caller weitergearbeitet würde.

aufrufen tu ich hier mit
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
image2.Picture.Bitmap := bildbearbeiten(image1);
// pico.free; << würde ich die hier oder im OnClose() <<<-#############################
// imo.free; löschen, wüßte Delphi nicht wo, oder was <<<-#############################
end;
diese beiden ^^

Wo/ darf ich die pico.free; imo.free; hinschreiben?
Wo gehören die hin?

Erzeuge ich nicht ein Bitmap, ohne das wieder zu zerstören/freizugeben und verbleibt das dann nicht im RAM - kommen noch mehrere dazu?

Eine Übergabe an form1.image2.picture.bitmap := imo; möchte ich nicht machen, da man ja bei Functionen nie weiß, ob man die mal auch in anderen Units einsetzen möchte. (mir geht es um die Generalisierbarkeit)

Danke.
eine Signatur? - in 2022? - WOZU ?!!!

Geändert von BMI ( 1. Mär 2018 um 17:17 Uhr)
  Mit Zitat antworten Zitat