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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Nom : sigsegv.png
Affichages : 112
Taille : 24,8 Ko
En pas à pas, ça se produit au end; de fin de fonction.

La manière d'appeler cette fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...