<div dir="ltr">Hi,<div><br></div><div><div>Tony Whyman had posted on August 10 a problem with the compiler using Delegates.</div><div>He used a workaround to "solve" his problem and the thread died.</div></div><div><div><br></div><div>So, I coded a new example — more simpler, I think — to demonstrate the same problem and prove that there is some wrong that is causing a memleak.<br></div><div><br></div><div>=== BEGIN CODE ===</div><div><br></div><div><div>program Project1;</div><div><br></div><div>{$mode objfpc}{$H+}</div><div><br></div><div>uses</div><div>  Classes, SysUtils;<br></div><div><br></div><div>type</div><div>  IValue = interface</div><div>    function AsString: string;</div><div>  end;</div><div><br></div><div>  TIntegerValue = class(TInterfacedObject, IValue)</div><div>  private</div><div>    FValue: Integer;</div><div>  public</div><div>    constructor Create(Value: Integer);</div><div>    destructor Destroy; override;</div><div>    function AsString: string;</div><div>  end;</div><div><br></div><div>  TMyApp = class(TInterfacedObject, IValue)</div><div>  private</div><div>    FValue: IValue;</div><div>  public</div><div>    constructor Create(Value: Integer);</div><div>    destructor Destroy; override;</div><div>    property Value: IValue read FValue implements IValue;</div><div>  end;</div><div><br></div><div>{ TIntegerValue }</div><div><br></div><div>constructor TIntegerValue.Create(Value: Integer);</div><div>begin</div><div>  inherited Create;</div><div>  FValue := Value;</div><div>  WriteLn('TIntegerValue.Create');</div><div>end;</div><div><br></div><div>destructor TIntegerValue.Destroy;</div><div>begin</div><div>  WriteLn('TIntegerValue.Destroy');</div><div>  inherited Destroy;</div><div>end;</div><div><br></div><div>function TIntegerValue.AsString: string;</div><div>begin</div><div>  Result := 'Number is ' + IntToStr(FValue);</div><div>end;</div><div><br></div><div>{ TMyApp }</div><div><br></div><div>constructor TMyApp.Create(Value: Integer);</div><div>begin</div><div>  inherited Create;</div><div>  FValue := TIntegerValue.Create(Value);</div><div>  WriteLn('TMyApp.Create');</div><div>end;</div><div><br></div><div>destructor TMyApp.Destroy;</div><div>begin</div><div>  WriteLn('TMyApp.Destroy');</div><div>  inherited Destroy;</div><div>end;</div><div><br></div><div>// Program</div><div><br></div><div>procedure ExecuteIntegerValue;</div><div>var</div><div>  V: IValue;</div><div>begin</div><div>  WriteLn;</div><div>  WriteLn('IntegerValue:');</div><div>  V := TIntegerValue.Create(5);</div><div>  WriteLn(V.AsString);</div><div>end;</div><div><br></div><div>procedure ExecuteMyApp;</div><div>var</div><div>  App: TMyApp;</div><div>begin</div><div>  WriteLn;</div><div>  WriteLn('MyApp:');</div><div>  App := TMyApp.Create(10);</div><div>  try</div><div>    WriteLn(App.Value.AsString);</div><div>  finally</div><div>    App.Free;</div><div>  end;</div><div>end;</div><div><br></div><div>procedure ExecuteMyAppAsInterface;</div><div>var</div><div>  V: IValue;</div><div>begin</div><div>  WriteLn;</div><div>  WriteLn('MyAppAsInterface:');</div><div>  V := TMyApp.Create(20);</div><div>  WriteLn(V.AsString);</div><div>end;</div><div><br></div><div>begin</div><div>  ExecuteIntegerValue;</div><div>  ExecuteMyApp;</div><div>  ExecuteMyAppAsInterface;</div><div>  ReadLn;</div><div>end.</div></div><div><br></div><div>=== END CODE ===</div><div><br></div><div><br></div><div>Here is the output on my machine (Lazarus 1.7 r52880M FPC 3.0.1 i386-win32-win32/win64)</div><div><br></div><div><br></div><div>=== BEGIN OUTPUT ===</div><div><div><br></div><div>W:\temp>project1.exe</div><div><br></div><div>IntegerValue:</div><div>TIntegerValue.Create</div><div>Number is 5</div><div>TIntegerValue.Destroy</div><div><br></div><div>MyApp:</div><div>TIntegerValue.Create</div><div>TMyApp.Create</div><div>Number is 10</div><div>TMyApp.Destroy</div><div>TIntegerValue.Destroy</div><div><br></div><div>MyAppAsInterface:</div><div>TIntegerValue.Create</div><div>TMyApp.Create</div><div>Number is 20</div><div><br></div><div>Heap dump by heaptrc unit</div><div>83 memory blocks allocated : 2017/2200</div><div>81 memory blocks freed     : 1981/2160</div><div>2 unfreed memory blocks : 36</div><div>True heap size : 229376 (80 used in System startup)</div><div>True free heap : 229104</div><div>Should be : 229128</div><div>Call trace for block $01812928 size 20</div><div>  $004017DA  TMYAPP__CREATE,  line 59 of W:/temp/project1.lpr</div><div>  $00401B82  EXECUTEMYAPPASINTERFACE,  line 101 of W:/temp/project1.lpr</div><div>  $00401C08  main,  line 108 of W:/temp/project1.lpr</div><div>Call trace for block $018128C8 size 16</div><div>  $00401B82  EXECUTEMYAPPASINTERFACE,  line 101 of W:/temp/project1.lpr</div><div>  $00401C08  main,  line 108 of W:/temp/project1.lpr</div><div><br></div><div>W:\temp></div></div><div><br></div><div>=== END OUTPUT ===</div></div><div><br></div><div><br></div><div>As you can see, the problem occurs just in the last test, when the classe TMyApp is used as an instance of the interface IValue.</div><div><br></div><div><div>I don't know if this problem was solved on trunk. I would like to know.</div><div>If not solved, I will open an issue.</div></div><div><br></div><div>Best regards,</div><div>Marcos Douglas</div></div>