-
Libérer la mémoire
Bonjour à tous
(Désolé de faire deux sujets, mais j'avais deux questions c'est pourquoi il me semblait plus efficace pour l'organisation du forum de créer deux sujets distincts).
Ma question est simple:
Dans mon projet j'ai un panel dans lequel j'ajoute des controls, voir des usercontrol dans lesquels il y a des calculs avec des variables.
Quand je veux me débarasser du tout, je fais juste panel.Controls.clear pour tout enlever et ensuite afficher la suite.
C'est pourquoi je souhaitais savoir, toutes les variables créées dans mes user controls (et meme tous les controls qui se trouvaient dans mon panel) sont -elles détruites quand je fais clear ? Ou faut-il le faire manuellement ?
J'ai un peu cherché sur MSDN, je suis tombé sur ça:
http://msdn.microsoft.com/en-us/libr...ble.clear.aspx
Mais cela ne semble pas résoudre mon problème, enfin de ce que j'ai compris.
Merci d'avance , r0seBa
-
Bonsoir.
Ton contrôle est doté de deux types de données : managées (string, int, List<T>, etc) et non-managées (chaque contrôle possède un handler Win32).
Les ressources managées sont candidates au nettoyages (i.e. : nettoyées lors d'un prochain passage du ramasse-miettes) dès lors que tu perds toute référence à ton contrôle (plus aucune variable ne pointe vers lui). Les ressources non-managées seront quant à elles nettoyées lors de l'appel à Dispose() et celle-ci sera de toute façon appelée par le destructeur du contrôle, même s'il est recommandé d'appeler Dispose() dès que possible. Le designer Winforms surcharge par défaut la méthode Dispose pour qu'elle appelle le Dispose de chaque contrôle instancié par le designer.
Donc... Que se passe t-il quand tu fais clear ? Ces références vers tes contrôles sont bien perdues. S'il n'en reste pas d'autres (pense notamment aux événements, peut-être aux bindings, gaffe aussi à d'éventuelles références circulaires au sein de ton contrôle : le GC peut faire avec mais c'est mieux de nettoyer), tout devrait finir par être correctement nettoyé, tant les variables managées que non-managées.
-
En gros, .NET (le garbage collector pour ne pas le nommer) libère de la mémoire quand il le faut (suivant un méchanisme complexe). Alors un objet ne peut-etre libéré que si il n'y a plus de références vers lui (en tout pas plus de fortes, WeakReference ne comptant evidemment pas).
Le diable est dans les détails : il parfois il reste une référence à gauche à droite (style liaison à un evenement), c'est pour ça qu'il faut bien faire des clean/dispose.
-
Merci pour vos réponses.
Donc dans mon cas, (Dans l'absolu je ne sais pas ce que mon panel contient ça change en fonction des choix de l'utilisateur) il faudrait que je fasse un dispose sur chaque composant avant de faire un clear ?
-
Appeler Dispose n'est pas nécessaire, les ressources managées et non-managées finiront par être nettoyées.
Mais c'est une bonne pratique : libérer les ressources non-managées dès que possible vise, j'imagine, à empêcher que celles-ci ne le soient jamais si l'appli venait à crasher, et à garder les ressources du système au plus bas (pas de handle qui traînent en attendant un nettoyage). Quant à la libération des références circulaires, ça évite au GC de patiner un moment ce qui tend à produire des fuites mémoires.
Dans ton cas, un nettoyage propre serait donc :
1. Virer toute référence circulaire (paents ayant souscrits à des évènements sur leurs enfants)
2. Appeler Dispose sur les contrôles
3. Appeler clear sur la liste des contrôle