Memory leak with Lazy?

Issue #208 invalid
Pavel Novak created an issue

I have 2 simple models with OneToMany relation:

[Entity]
  [Table('Prijemka', 'Obch_Data')]
  TModelPrijemkaTest = class
  private
    FID: Int64;
    FCislo: Integer;
    [OneToMany(False, [ckCascadeAll])]
    FPolozky: Lazy<IList<TModelPrijemkaPolTest>>;
    function GetPolozky: IList<TModelPrijemkaPolTest>;
    procedure SetPolozky(const Value: IList<TModelPrijemkaPolTest>);
  public
    constructor Create;
    [UniqueConstraint]
    [AutoGenerated]
    [Column('ID',[cpRequired,cpPrimaryKey,cpDontUpdate,cpNotNull],10,0)]
    property ID: Int64 read FID write FID;
    [Column('Cislo',[cpRequired,cpNotNull],10,0)]
    property Cislo: Integer read FCislo write FCislo;
    property Polozky: IList<TModelPrijemkaPolTest> read GetPolozky write SetPolozky;
  end;

  [Entity]
  [Table('PrijemkaPol', 'Obch_Data')]
  TModelPrijemkaPolTest = class
  private
    FDoklad: Integer;
    FID: string;
    FKod: Int64;
    FNazev: string;
    [ForeignJoinColumn('Doklad', 'Prijemka', 'ID', [fsOnDeleteCascade, fsOnUpdateCascade])]
    FPrijemka: TModelPrijemkaTest;
  public
    constructor Create;
    [Column('Doklad',[cpRequired,cpNotNull],10,0)]
    property Doklad: Integer read FDoklad write FDoklad;
    [ManyToOne(False, [ckCascadeAll], 'ID')]
    property Prijemka: TModelPrijemkaTest read FPrijemka write FPrijemka;
    [AutoGenerated]
    [Column('ID',[cpRequired,cpPrimaryKey,cpDontUpdate,cpNotNull],254)]
    property ID: string read FID write FID;
    [Column('Kod',[cpRequired,cpNotNull],19,0)]
    property Kod: Int64 read FKod write FKod;
    [Column('Nazev',[],50)]
    property Nazev: string read FNazev write FNazev;
  end;

Now I use test code:

var
  lModel:TModelPrijemkaTest;
  lPocet: Integer;
begin
  lModel:=Session.FindOne<TModelPrijemkaTest>(13);
  lPocet:=lModel.Polozky.Count;
  lModel.Polozky.Clear;
  lModel.Free;
end;

Main model have 3 items (Polozky),it's OK,but FastMM show memory leak:

21 - 36 bytes: TModelPrijemkaTest x 3, TCriticalSection x 3
37 - 52 bytes: TLazy<System.IInterface> x 3
53 - 68 bytes: TAbstractSession.ResolveLazyInterface$18829$ActRec x 3

This is bug or something wrong in my code?

Comments (4)

  1. Stefan Glienke repo owner

    You realize that it shows TModelPrijemkaTest x 3 and not as you claim TModelPrijemkaPolTest x 3, yes? So obviously somewhere else you fetch those and don't free them.

  2. Stefan Glienke repo owner

    Nevermind. Its the FPrijemka field in the TModelPrijemkaPolTest instances that are not freed. They are not pointing to their parent instance obviously.

  3. Log in to comment