Thema: Delphi Leak verzweifelt gesucht

Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: Leak verzweifelt gesucht

  Alt 4. Nov 2006, 20:03
Um jetzt nicht einen neuen Thread aufzumachen: Ich habe ein ähnliches Problem ... warum kommt es hier zu MemoryLeaks:

Delphi-Quellcode:
procedure TMainForm.ListCategories;

procedure AddChilds(Parent: PVirtualNode; Items: array of integer);
var
  i: integer;
  Data: PCategoryData;
begin
  for i := 0 to length(Items) -1 do
  begin
    Data := Categories.GetNodeData(Categories.AddChild(Parent));
    Data.Caption := Cats[Items[i]].Caption;
    Data.Hint := Cats[Items[i]].Hint;
    Data.ImageIndex := Items[i];
  end;
end;

function AddParent(ID: integer): PVirtualNode;
var
  Data: PCategoryData;
begin
  Result := Categories.AddChild(nil);
  Data := Categories.GetNodeData(Result);
  Data.Caption := Cats[ID].Caption;
  Data.Hint := Cats[ID].Hint;
  Data.ImageIndex := ID;
  Data.IsParent := true;
end;

begin
  Categories.Clear;
  Categories.BeginUpdate;
  try
    //Client
    AddChilds(AddParent(0), [1, 2, 3]);
    //Information
    AddChilds(AddParent(4), [5, 6, 7, 8, 9, 10, 11]);
    //Administration
    AddChilds(AddParent(12), [13, 14, 15, 16, 17, 18]);
    //Shell
    AddChilds(AddParent(19), [20, 21]);
    //Sonstiges
    AddChilds(AddParent(22), [23, 24, 25, 26, 27, 28, 29, 30, 31]);
    //Spionage
    AddChilds(AddParent(32), [33, 34, 35, 36, 37]);
    //Manager
    AddChilds(AddParent(38), [39, 40, 41, 42, 43, 44]);

    //Plugins
    PluginNode := AddParent(45);
    //Server erstellen
    AddParent(46);
  finally
    Categories.EndUpdate;
  end;
end;
Delphi-Quellcode:
type
  PCategoryData = ^TCategoryData;
  TCategoryData = record
    Caption: string;
    Hint: string;
    ImageIndex: integer;
    IsParent: boolean;
  end;

type
  TCatData = record
    Caption: string;
    Hint: string;
  end;

var
  Cats: array of TCatData;
Cats wird aus einer INI Datei dynamisch geladen. Dabei sind die Items immer mit Zahlen belegt (es ist eine durchgehende Zahlenreihe von 0 .. 46)

Delphi-Quellcode:
Ini.ReadSection('Categories', Items);
SetLength(Cats, Items.Count);
for i := 0 to Items.Count -1 do
begin
  try
    Cats[StrToInt(Items[i])].Caption := Ini.ReadString('Categories', Items[i], '');
    Cats[StrToInt(Items[i])].Hint := Ini.ReadString('CatHints', IntToStr(i), '');
  except

  end;
end;
Die Freigabe sieht so aus:

Delphi-Quellcode:
procedure TMainForm.CategoriesFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  NodeArray: PCategoryData;
begin
  NodeArray := Sender.GetNodeData(Node);
  Finalize(NodeArray^);
end;
Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat