Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Memoryleak durch Erstellen v. Objekt in Function()?

  Alt 1. Mär 2018, 16:23
Ja, das gibt ein Memory-Leak, weil der Setter von TPicture.Bitmap nicht die Referenz übernimmt, sondern eine Kopie erstellt.

Die Implementierung sieht ungefähr so aus:
Delphi-Quellcode:
type
  TPicture = class
  private
    FBitmap: TBitmap;
    procedure SetBitmap(const ABitmap: TBitmap);
    // ...
  public
    property Bitmap: TBitmap read FBitmap write SetBitmap;
    // ...
  end;

procedure TPicture.SetBitmap(const ABitmap: TBitmap);
begin
  FBitmap.Assign(ABitmap); // <====
end;
Das heißt, wenn „ABitmap“ der Rückgabewert einer Funktion ist, dann wird der Rückgabewert nie freigegeben.

Du musst eine zusätzliche Variable benutzen:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Tmp: TBitmap;
begin
  Tmp := bildbearbeiten(image1);
  image2.Picture.Bitmap := Tmp;
  Tmp.Free;
end;
  Mit Zitat antworten Zitat