Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   MemoryLeak bei VirtualStringtree (https://www.delphipraxis.net/171942-memoryleak-bei-virtualstringtree.html)

youuu 4. Dez 2012 18:22

AW: MemoryLeak bei VirtualStringtree
 
Hm also wenn ich es so mach:

Delphi-Quellcode:
procedure Tfrm_start.VstFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
Var
  Liste: ^Tliste;
begin
  Liste := Sender.GetNodeData(node);
  Liste^.Free;
end;
Bleibt der Leak bestehen.




Edit: So werden die Nodes hinzugefügt.

Delphi-Quellcode:
while not Query.Eof do begin
  Liste := TListe .Create;
  with Liste do begin
    ... Daten
  end;

  Node := FVst.AddChild(nil, KundenListe);
  Node.CheckType:= ctCheckBox;

  Query.Next;
end;
VstFreeNode muss ich nicht noch extra speziell aufrufen oder?

Zacherl 4. Dez 2012 19:04

AW: MemoryLeak bei VirtualStringtree
 
Gibt es bei dir Nodes, die nicht sichtbar sind? Rufe mal für jede Node, die du hinzufügst
Delphi-Quellcode:
ValidateNode(Node)
auf. Ich hatte das selbe Problem, was daran liegt, dass für nicht validated Nodes kein OnFreeNode Event aufgerufen wird. Nodes werden standardmäßig erst dann validiert, wenn sie mindestens einmal sichtbar waren.

youuu 4. Dez 2012 19:08

AW: MemoryLeak bei VirtualStringtree
 
Sind alle Sichtbar, kein Node ist unsichtbar.

Angeblich soll hier der Leak sein
Delphi-Quellcode:
 KundenListe := TKundenListe.Create;

youuu 4. Dez 2012 19:11

AW: MemoryLeak bei VirtualStringtree
 
Liste der Anhänge anzeigen (Anzahl: 1)
Siehe Anhang ein Bild, welches mich auch verwirrt. Wieso verursacht die System.pas auch Leaks? Und das alles erst nach dem füllen des VST's

Zacherl 4. Dez 2012 19:14

AW: MemoryLeak bei VirtualStringtree
 
Zitat:

Zitat von youuu (Beitrag 1194333)
Sind alle Sichtbar, kein Node ist unsichtbar.

Probier das
Delphi-Quellcode:
ValidateNode()
zur Sicherheit bitte trotzdem mal.

Zitat:

Zitat von youuu (Beitrag 1194333)
Angeblich soll hier der Leak sein
Delphi-Quellcode:
 KundenListe := TKundenListe.Create;

Das ist nur dann der Fall, wenn du deine Liste im OnFreeNode Event nicht wieder freigibst.

Ich weiß nicht, ob der VST damit zurecht kommt, wenn du direkt eine Klasse bzw. ein Objekt als Node nimmst. Ich gehe immer so vor:
Delphi-Quellcode:
type
  PMyNodeData = ^TMyNodeData;
  TMyNodeData = packed record
    Liste: TListe;
  end;
Dann irgendwo zur Initialisierung:
Delphi-Quellcode:
VST.NodeDataSize := SizeOf(TMyNodeData)


Nodes hinzufügen:
Delphi-Quellcode:
NodeData := VST.GetNodeData(VST.AddChild(nil));
NodeData^.Liste := TListe.Create;
// ..
Im OnFreeNode Event:
Delphi-Quellcode:
NodeData := Sender.GetNodeData(Node);
if Assigned(NodeData) then
begin
  NodeData^.Liste.Free;
  // Wenn du Strings oder Ähnliches direkt im TMyNodeData Record verwendest einfach noch ein
  // Finalize(NodeData^)
  // hinterherschieben
end;
Edit: Der Leak stammt nicht wirklich aus der System.pas. Es wird irgendwo ein UnicodeString erzeugt, welcher nicht mehr freigegeben wird. Lediglich die Funktion zum Erstellen eines neuen Strings befindet sich in der System.pas und wird per compiler magic oder was auch immer automatisch von Delphi aufgerufen, sobald du eine neue String Instanz erzeugst.

Edit: Was mir grade noch einfällt: Das Leak könnte sich auch in deiner TListe Klasse befinden. Prüf das am besten auch nochmal.

youuu 4. Dez 2012 19:34

AW: MemoryLeak bei VirtualStringtree
 
Edit: das war es, Leak ist entfernt. Danke Dir. Ich musste also nur das Objekt richtig einbinden


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 Uhr.
Seite 2 von 2     12   

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