Page 1 of 1

PrintPreview Resource Leak

PostPosted: June 14th, 2016, 7:22 am
by MeW
In the application I'm using an obscure resource leak occurred. I could not figure out, why my code would be wrong after having been 'Print Previewed'. Until I researched the Preview.pas itself. The TThumbnailPreview destructor does not free the LargeImages. When I added an extra line of code, the resource leaks were gone. So please fix the following:
Code: Select all
destructor TThumbnailPreview.Destroy;
begin
  LargeImages.Free; // <<==-- Add this line to prevent obscure resource leaks
  FPaperViewOptions.Free;
  Page.Free;
  inherited Destroy;
end;

Re: PrintPreview Resource Leak

PostPosted: July 6th, 2016, 1:18 pm
by sh17

Re: PrintPreview Resource Leak

PostPosted: July 6th, 2016, 8:59 pm
by MeW
(Y)

Re: PrintPreview Resource Leak

PostPosted: August 6th, 2016, 7:26 am
by Kambiz
There should not be a memory leak, and there was none until Delphi 2010.

The LargeImages object is owned by TThumbnailPrevew instance. In Delphi, owner takes care of freeing the owned components when it is being freed.

Code: Select all
constructor TThumbnailPreview.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if Assigned(AOwner) and (AOwner is TControl) then
    FixControlStyles(TControl(AOwner));
  FZoom := 10;
  FSpacingHorizontal := 8;
  FSpacingVertical := 8;
  FMarkerColor := clBlue;
  FPaperViewOptions := TPaperPreviewOptions.Create;              // This object is not owned by component, so it should be freed implicitly in the destructor
  FPaperViewOptions.OnChange := PaperViewOptionsChanged;
  Page := TBitmap.Create;                                        // This object is not owned by component too, so it should be freed implicitly
  ParentColor := True;
  ReadOnly := True;
  ViewStyle := vsIcon;
  LargeImages := TImageList.Create(Self);                        // "Self" is passed as owner, so "Self" is responsible for freeing the TImageList instance.
  Align := alLeft;
end;

destructor TThumbnailPreview.Destroy;
begin
  FPaperViewOptions.Free;
  Page.Free;
  inherited Destroy;
end;

Re: PrintPreview Resource Leak

PostPosted: August 6th, 2016, 8:33 am
by MeW
I agree, but the test case I had at hand proved otherwise. Haven't checked any further.. Should I? I've tested this in Delphi 10.1 Berlin.

Re: PrintPreview Resource Leak

PostPosted: August 7th, 2016, 8:25 am
by Kambiz
Delphi 2010 was the last version of Delphi that I used for coding. Maybe the way that the owned components are managed is different in the newer versions of Delphi. If it is the case, then there would memory leak in most old components.