IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Libérer la mémoire


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut 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

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    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.

  3. #3
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    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.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Par défaut
    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 ?

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [free] dois-je libérer la mémoire ?
    Par bulki dans le forum C
    Réponses: 9
    Dernier message: 15/05/2007, 15h59
  2. Libérer la mémoire consommée par un DataModule
    Par liviertlse dans le forum Bases de données
    Réponses: 16
    Dernier message: 10/05/2007, 14h59
  3. Libérer la mémoire en multi-thread
    Par Nathan dans le forum Général Python
    Réponses: 2
    Dernier message: 17/10/2006, 12h36
  4. Libérer la mémoire allouée à un objet
    Par boudou dans le forum Langage
    Réponses: 6
    Dernier message: 21/02/2006, 22h25
  5. Comment libérer la mémoire d'un TList ?
    Par Tchaill39 dans le forum Langage
    Réponses: 8
    Dernier message: 16/11/2005, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo