[fpc-pascal] Where and Why is there a memory leak?

Tony Whyman tony.whyman at mccallumwhyman.com
Wed Sep 6 17:27:46 CEST 2017


Is history repeating itself:

http://lists.freepascal.org/pipermail/fpc-pascal/2016-August/048579.html


On 06/09/17 09:31, Graeme Geldenhuys wrote:
> Hi,
>
> Playing with this small sample application to answer another question 
> in this mailing list, I noticed the sample application has a memory 
> leak. For the life of me I can't see why or how to resolve it.
>
> I tested with FPC 2.6.4, 3.0.2 and 3.0.4-rc1 under 64-bit FreeBSD.
>
> =======================[ project1.pas ]============================
> program project1;
>
> {$mode objfpc}{$H+}
> {$interfaces COM}
>
> type
>   IHook = interface
>     ['{4BCAEDD8-92D8-11E7-88D3-C86000E37EB0}']
>     procedure DoIt;
>   end;
>
> type
>   THook = class(TInterfacedObject, IHook)
>   private
>     procedure DoIt;
>   end;
>
>   procedure THook.DoIt;
>   begin
>     writeln(ClassName + ' did it');
>   end;
>
> type
>   TBaseClass = class(TInterfacedObject, IHook)
>   private
>     FHook: IHook;
>     property Hook: IHook read FHook implements IHook;
>   public
>     constructor Create;
>     destructor Destroy; override;
>   end;
>
>   constructor TBaseClass.Create;
>   begin
>     FHook := THook.Create;  // FPC 2.6.4 reports a memory leak here
>   end;
>
>   destructor TBaseClass.Destroy;
>   begin
>     // nothing to do here
>   end;
>
>
> var
>   base: IHook;
>
> begin
>   base := TBaseClass.Create;
>   base.DoIt;
>   base := nil; // just to see if it helped with the memory leak - it 
> doesn't
>
> end.
> ==============================[ end ]==============================
>
>
> When I run the program, the output is as follows:
>
> [t1]$ ./project1
> THook did it
> Heap dump by heaptrc unit
> 4 memory blocks allocated : 115/120
> 2 memory blocks freed     : 51/56
> 2 unfreed memory blocks : 64
> True heap size : 1114112 (32 used in System startup)
> True free heap : 1113696
> Should be : 1113760
> Call trace for block $000000080072F180 size 32
>   $0000000000400379 line 35 of project1.lpr
> Call trace for block $000000080072F0C0 size 32
>
>
>
> Personally I always use CORBA style interfaces, never reference 
> counted COM style interfaces. So my programs normally don't have this 
> issue, and I use interfaces a lot.
>
>
>
>
> Regards,
>   Graeme
>




More information about the fpc-pascal mailing list