1 pièce(s) jointe(s)
Impossible de libérer une stringlist dynamiquement créée
Bonjour,
J'ai encore un truc à m'arracher les cheveux, heureusement qu'ils repoussent vite !
Je veux récupérer des noms de dossiers et des noms de fichiers depuis un TShellTreeView pour les insérer dans une TListbox, enfantin me direz-vous.
Oui, c'est ce que je croyais, j'ai donc attaqué avec 4 lignes juste pour voir si l'idée fonctionnait, ce qui est le cas, mais mal, car je ne peux pas libérer les TStringList's créées...
La preuve :
J'ai lancé le projet et j'ai cliqué sur 3 nœuds, à la clôture j'ai gagné 9 unfreed memory block.
J'ai recommencé avec 4 clics et là, 12 unfreed memory blocks, donc 1 clic = 3 unfreed blocks et voilà le code ultra-simple à l'origine de cette embrouille :
Code:
1 2 3 4 5 6 7 8
| function TForm1.ListDirectory(SelectedNode {as FolderSource}: string): TStrings;
var sl: TStringList;
begin
sl:= TStringList.Create;
sl.Add(SelectedNode); // pour test
Result := sl; // ok
// sl.Destroy; //sl.Free; //l'un comme l'autre = erreur
end; |
Pièce jointe 641865
En pas à pas, ça se produit au end; de fin de fonction.
La manière d'appeler cette fonction :
Code:
1 2 3 4 5 6
| procedure TForm1.stvClick(Sender: TObject);
begin
lbFonts.Items := ListDirectory(stv.GetPathFromNode(stv.Selected));
// GetPathFromNode returns the path (including the file name)
// from the file system that a particular node represents.
end; |
Ça fonctionne, les données que j'attends se retrouvent bien dans la listbox, c'est juste ces fuites qui me perturbent.
Quelque chose d'énorme doit m'échapper, mais je ne vois pas quoi...
Ce que je vois, par contre, dans l'aide et que je ne comprend pas, c'est l'absence de Free, mais comme vous le voyez dans le code, un essai avec Destroy retourne la même erreur.
J'ai jeté un œil à la pile d'appel, mais c'est ardu (dernière entrée en haut) :
Code:
1 2 3 4 5 6 7
| #0 SYSTEM$_$TOBJECT_$__$$_INHERITSFROM$TCLASS$$BOOLEAN at :0
#1 fpc_do_is at :0
#2 ?? at :0
#3 ASSIGN(0x7ffff60b2200, 0x7ffff60b4e00) at gtk2int.pas:612
#4 SETITEMS(0x7ffff5734ef0, 0x7ffff60b4e00) at include/customlistbox.inc:587
#5 STVCLICK(0x7ffff6403790, 0x7ffff5730f10) at unit1.pas:139 <-- c''est bien la ligne qui appelle la fonction ListDirectory sur l''événement stvClick.
avant c''est pas intéressant |
Alors, si quelqu'un a une idée, merci de la poster...