![]() |
VST Speicherleak
Hallo,
ich erzeuge die Knoten für ein VST:
Delphi-Quellcode:
Die Initialisierung
PTreeData = ^TTreeData;
TTreeData = record ID : integer; Single : boolean; // Einzelliste FixID : integer; Kategorie : Char; Untergrp : Char; isUntergrp : boolean; Index : integer; Title : string; isKategorie : boolean; end;
Delphi-Quellcode:
Bei VST.Free bleibt zum Programmende ein Speicherleak mit einer Anzahl nicht freigegebener Strings.
VST.NodeDataSize := sizeof(TTreeData);
VST.BeginUpdate; VST.Clear; Was muss ich noch freigeben? Für einen Tip dankbar. Gruß Peter |
Re: VST Speicherleak
Hallo Peter,
du solltest auf jeden Fall das Ereignis OnFreeNode behandeln und dort durch einen Aufruf von ![]()
Delphi-Quellcode:
Das Ereignis wird für jeden sichtbaren Knoten automatisch ausgelöst. Es könnte eventuell notwendig sein, schon beim Erzeugen der Knoten einen späteren Aufruf zu erzwingen:
procedure TForm1.VSTreeNode (Sender: TBaseVirtualTree; Node: PVirtualNode);
var NodeData : PTreeData; begin NodeData := Sender.GetNodeData(Node); Finalize (NodeData^); end;
Delphi-Quellcode:
Gruß Hawkeye
Node := VST.AddChild(nil);
... VST.InvalidateNode (Node); // erzwingt Aufruf von OnFreeNode bei Freigabe |
Re: VST Speicherleak
Zitat:
Habe ich ausprobiert, bringt aber nichts. Als Leak werden ausschließlich Strings protokolliert. Gruß Peter |
Re: VST Speicherleak
Im OnFree musst Du die strings Deines Records auf nil (bei Strings '') setzen.
...:cat:... |
Re: VST Speicherleak
Hallo sakura,
Zitat:
Zitat:
Gruß Hawkeye |
Re: VST Speicherleak
Zitat:
Hier die Freigabe
Delphi-Quellcode:
und hier das Erzeugen des Baumes:
procedure TForm5.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode); var NodeData : PTreeData; begin NodeData := Sender.GetNodeData(Node); NodeData.Title := ''; Finalize (NodeData^); end;
Delphi-Quellcode:
Gruß
procedure Add(Gruppe: Char;ID : integer; Titel:string);
var i : integer; sel : boolean; Node1 : PVirtualNode; begin sel := true; for i := 0 to Lst.Count -1 do begin zg := TDruckliste(Lst[i]); if zg.Untergrp = Gruppe then begin if Sel then // Bei erstmaligen Auftreten Gruppenkopf anlegen begin Child := VST.AddChild(nil); // VST.AddChild(Node); VST.InvalidateNode (Child); ptr := VST.GetNodeData(Child); ptr^.ID := ID; ptr^.Title := Titel; ptr^.Single := false; ptr^.Untergrp := Gruppe; ptr^.FixID := zg.FixRep; ptr^.isUntergrp := true; sel := false; end; Node1 := VST.AddChild(Child); VST.InvalidateNode (Node1); ptr := VST.GetNodeData(Node1); ptr^.ID := zg.RID; ptr^.Title := zg.Titel; ptr^.Single := false; ptr^.Untergrp := Gruppe; ptr^.FixID := zg.FixRep; ptr^.isUntergrp := false; zg.Node := Node1; VST.CheckType[node1] := ctCheckBox; Node1.CheckType := ctCheckBox; Node1.CheckState := csUncheckedNormal; VST.CheckState[node1] := csUncheckedNormal; end; end; VST.Invalidate; end; Peter |
Re: VST Speicherleak
Peter, ersetze einmal die Aufrufe von InvalidateNode durch Aufrufe von ReinitNode:
Delphi-Quellcode:
Du solltest dir auch überlegen, ob es sinnvoll ist, Kopien der bereits im Speicher befindlichen Daten in den Baum zu stecken. Wäre es nicht einfacher, einen Verweis in den Knoten abzulegen und über diesen bei Bedarf auf die Daten zuzugreifen?
// VST.InvalidateNode (Node1);
VST.ReinitNode (Node1, False); Gruß Hawkeye |
Re: VST Speicherleak
Zitat:
erst mal vielen Dank für den Tip. ReinitNode beseitigt das Speicherleak! Die Daten lade ich eigentlich nur temporär in den Speicher und gebe sie nach der Initialisierung des Treeview wieder frei. Das Treeview zeigt kategorisierte Drucklisten zur Auswahl an. Hat maximal 30 Einträge. Das Speicherleak war insofern ein Problem, da ich das Treeview programmabhängig öfter mit unterschiedlichen Daten initialisiere. Ich überlege jetzt allerdings, ob ich in den Nodedaten nur einen Index ablege und den Titel in einer Stringliste extern unterbringe. Also nochmals vielen Dank für die Unterstützung. Mit Gruß Peter |
Re: VST Speicherleak
Ihr macht euch das etwas kompliziert hier.
Das Speicherleck wird von den String kommen. Du hast 2 einfache Möglichkeiten. 1) du nutzt Shortstrings im Record (Title:string[255]); 2) im onFreeNode-Ereignis setzt den den Titel im Record einfach auf "". Dann kannst du auch die Largestrings nutzen. Im DP Stammstisch 3 Video habe ich die Problematik kurz erwähnt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz