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

Graeme Geldenhuys mailinglists at geldenhuys.co.uk
Wed Sep 6 10:31:12 CEST 2017


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

-- 
fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal
http://fpgui.sourceforge.net/

My public PGP key:  http://tinyurl.com/graeme-pgp



More information about the fpc-pascal mailing list