Wyciek pamięci - VirtualStringTree

0

hej, Delphi XE raportuje mi o wycieku pamięci (pełno UnicodeStringow). Wiec kody prezentują sie nastepująco:

Przechowywać chce wyłącznie tekst w węzłach. W OnCreate

vtPanel.NodeDataSize := SizeOf(PString);
procedure TfPanel.vtPanelGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
begin
  CellText := PString(Sender.GetNodeData(Node))^;
end;
procedure TfPanel.vtPanelFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
   Finalize(Sender.GetNodeData(Node)^);
end;

Przy okazji kompilator informuje że Finalize jest zbędne i go pomija...

0
type
  TData = record
    val: string;
  end;
  PData = ^TData;

vtPanel.NodeDataSize := SizeOf(TData);


procedure TfPanel.vtPanelGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
begin
  CellText := Sender.GetNodeData(Node)^.val;
end;
0

powiedz mi, po co tworzyć nowy typ ?
Moze troche mam za idealistyczne podejscie ;p
Skoro jest zdefiniowany w Systemie PString to czy nie da sie nim bezposrednio ??

0

do NodeDataSize nie podaje się typu wskaźnikowego, pokaż OnInitNode.

0

nie mam wypełnionego tego zdarzenia..

0

to jak inicjujesz dane drzewka?

0

no jedyne co inicuje to ten DataSize, potem uzywam tych funkcji do budowy wezlow i generalnie ladnie dziala...:

function WstawLisc(nazwa:String; Node:PVirtualNode; Drzewko : TVirtualStringTree):PVirtualNode;
var
Wskaznik : PVirtualNode;
begin
Drzewko.BeginUpdate;
Wskaznik:=Node;
Drzewko.ChildCount[Wskaznik]:=Drzewko.ChildCount[Wskaznik]+1;
Wskaznik := Drzewko.GetLastChild(Wskaznik);
Wskaznik.States := Wskaznik.States + [vsInitialUserData];
PString(Drzewko.GetNodeData(Wskaznik))^ := nazwa;
Drzewko.EndUpdate;
result:=Wskaznik;
end;

function WstawRoot(nazwa:String; Drzewko : TVirtualStringTree): PVirtualNode;
var
Wskaznik : PVirtualNode;
begin
Drzewko.BeginUpdate;
Drzewko.RootNodeCount:=Drzewko.RootNodeCount+1;
Wskaznik := Drzewko.GetLast;
Wskaznik.States := Wskaznik.States + [vsInitialUserData];
PString(Drzewko.GetNodeData(Wskaznik))^ := nazwa;
Drzewko.EndUpdate;
Result:=Wskaznik;
end;

0

string jest wskaźnikiem sam w sobie, z tym że jest dość specyficznym wskaźnikiem. PString tak naprawdę jest to wskaźnik na wskaźnik i jako taki jest używany bardzo rzadko.
String 'czyści się' sam, tzn. jak jest już nie potrzebny pamięć po nim jest zwalniana. Finalize działa tylko dla łańcuchów znaków, variantów bądź interfejsów, dla innych typów jest ignorowana przez kompilator.
Tutaj te napisy gubią się bo finalize jest olewane przez kompilator. Masz dwa wyjścia - zrobić tak jak napisałem wcześniej albo jawnie przypisywać pamięć dla każdego napisu a potem ją zwalniać (NewStr - DisposeStr, GetMem - FreeMem)

1 użytkowników online, w tym zalogowanych: 0, gości: 1