Einzelnen Beitrag anzeigen

Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#1

Dynamische Packages - Forms anzeigen - Leak

  Alt 12. Jan 2016, 14:25
Ich möchte gerne forms in packages zur Verfügung stellen und diese dynamisch laden.
Jetzt habe ich festgestellt, dass der Speicher nicht mehr freigegeben wird (also auch bei leeren Forms ohne Nutzer-Interaktion oder Komponenten).
Wenn die Form angzeigt wird, werden ca. 300 byte nicht mehr freigegeben (vorausgesetzt, "memoryused" stimmt)

Was dagegen tun?

BPL mit Form:
Delphi-Quellcode:
Unit Gui.LoaderTestform;

{ This is a Test form
  for loader to test for memory leaks }

Interface

  Uses
    Windows,
    Messages,
    SysUtils,
    Variants,
    Classes,
    Graphics,
    Controls,
    Forms,
    Dialogs;

  Type
    TTestform = Class(TForm)
      Private
        { Private declarations }
      Public
        { Public declarations }
    End;

  Var
    Testform: TTestform;

Implementation

{$R *.dfm}

Initialization

   Registerclass(TTestform);

Finalization

   Unregisterclass(TTestform);

End.
Hauptprgramm:
Form anzeigen, nachdem das Package dynamisch geladen wurde:
Delphi-Quellcode:
Function Tplgfrm.Loadform(Parent: Tcomponent; Form: String; Modal: Boolean)
    : Boolean;
  Var
    FormClass: Tformclass;
  Begin
    Result := True;
    Try
      Form := 'T' + Form;
      FormClass := TFormClass(GetClass(Form));
      If FormClass = Nil Then
        Begin
          Raise Exception.Create('The form "' + Form + '" is not available.');
          Result := Not Result;
        End
      Else
        Begin
          With TComponentClass(FormClass).Create(Parent) As TCustomForm Do
            Try
              If Modal Then
                Showmodal
              Else
                Show;
            Finally
              // Free;
            End;
        End;
    Except
      Raise Exception.Create('Form could not be loaded.');
      Result := Not Result;
    End;
  End;
Den leak teste ich über die Differenz zweier Aufrufe folgender Funktion:
Delphi-Quellcode:
  Function MemoryUsed: Cardinal;
  Var
    St: TMemoryManagerState;
    Sb: TSmallBlockTypeState;
  Begin
    GetMemoryManagerState(St);
    Result := St.TotalAllocatedMediumBlockSize +
      St.TotalAllocatedLargeBlockSize;
    For Sb In St.SmallBlockTypeStates Do
      Begin
        Result := Result + Sb.UseableBlockSize * Sb.AllocatedBlockCount;
      End;
  End;

Geändert von Sequitar (12. Jan 2016 um 15:13 Uhr)
  Mit Zitat antworten Zitat