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

VB.NET Discussion :

Problème Dispose et mémoire


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Par défaut Problème Dispose et mémoire
    Bonjour,
    J'avais une question concernant le disposing des objets. j'ai actuellement un control1 avec dessus une centaine de controls2.
    Bon déjà j'ai remarqué que le fait de faire control1.controls.clear ne dispose pas les objets dessus.
    D'après ce que j'ai pu trouver dans mes recherches ils seront disposés tôt ou tard quand le système sera décidé x).
    Quand je force le GarbageCollector il n'y a aucune libération de la mémoire qui est visible.

    Nom : 7dxiJ.png
Affichages : 628
Taille : 30,7 Ko
    (GC a été réalisé avec le deuxième pic bleu...)

    Ensuite j'ai fait une fonction qui dispose tous les control2 un par un avant de les supprimer de control1. Puis je force le GC. La mémoire se libérè bien,...

    Si j'ai bien comprit il est obligatoire de faire une fonction qui dispose les objets non managés qu'une classe utilise sinon il seront jamais disposés tout seuls ?
    Je voulais aussi donc savoir comment ça se fait que la méthode dispose de mes controls est jamais appelée...

    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Par défaut
    La méthode dispose est appelée si tu l'appelles, sinon elle n'est effectivement pas appelé.

    Il y a effectivement un grand risque avec le controls.clear() qui ne dispose pas les objets ce qui cré souvent une fuite de mémoire.
    Par contre une fois que tu les as dispoés tu n'es pas obligé d'appelé le GC. A moins que tu es vraiment besoin de la RAM sur un vieux pc...

    Tu dois donc juste bien penser à disposer tes éléments.

    Donc en gros oui tu as bien compris.

  3. #3
    Membre confirmé Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Par défaut
    En aucun cas le dispose d'un control n'est appelé automatiquement Oo ?
    Actuellement j' appel le dispose de tous les controls dans l'event disposed du usercotnrol parent. Est-ce une bonne pratique ? sachant qu'on ne peut pas implement idisposable ou override la fonction dispose parente.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Par défaut
    Dans ton control tu peux normalement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Overloads Sub Dispose()
            'ToDo My code
     
            MyBase.Dispose()
        End Sub
    Après je pense qu'un dispose est fait quand tu quittes ton application mais en cours de route il faut que tu t'en occupes pour les objets non manager ce qui est assez lourd au début quand on y pense pas.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    il y a un peu de faux dans ce que dit chaparo



    Dispose sur un controle appelle des dispose sur tous ses enfants, qui appelleront dispose sur leurs enfants etc...
    c'est le code de la méthode Dispose de la classe control qui fait ca et tous les controles hérite de cette classe

    Dispose est appelé même si on ne l'appelle pas (mais on ne sait pas quand)
    en fait le gc a plusieurs "poches" de liens, et arrivés à je ne sais quel étage il appelle la méthode finalize qui appelle la méthode Dispose(false) dans l'implémentation standard de IDisposable proposée par microsoft
    Dispose(false) fait moins de chose que Dispose(true) (qui lui est appelé quand on appelle Dispose tout court) mais ca devrait suffire quand même

    même finalize n'a pas de garanti d'être appelé, en cas de plantage ou de fermeture d'appli (pas toutes) par exemple, en .net il n'y a pas vraiment de sens de destructeur obligatoire comme dans certains langages)
    (cette phrase n'est pas de moi, et j'ose espérer que par là ils voulaient dire qu'on ne peut pas être sûr que du code qu'on y aurait mis sera exécuté, mais la mémoire doit être libérée par la clr, enfin j'espère)

    ce n'est pas un overloads Dispose qu'il faut faire mais un overrides

    quand on code une classe on peut implémenter IDisposable et appeler le dispose de nos variables disposables dans la méthode dispose

    quand une instance n'est plus référencées toutes les variables sont mises à nothing, pour les dim dans les membres, c'est en sortie de membres qu'ils sont mis à nothing
    ceci permet au GC de voir qui n'est lié à personne

    le using / end using équivaut à un try finally qui dispose (forcément donc)

    concernant le controls.clear il est à éviter quand on a beaucoup de controles, nous on s'est codé une méthode d'extension DisposeControlesEnfants sur la classe control
    on peut donc écrire MonPanel.DisposeControlesEnfants (voir méthodes d'extension sur google, qui permet de rajouter des méthodes sur des classes qui ne sont pas à nous, comme celles du framework)

    en bref, en général tout se passe bien, mais pour certaines choses il faut faire attention à ce qu'on écrit (controls.clear, bim b new bitmap géant dans une boucle etc...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé Avatar de gaetan13
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Par défaut
    Merci beaucoup Pol63 pour cette réponse très complète.
    Je viens effectivement de constater que le dispose d'un contrôle entrainait le dispose de ses contrôles enfant.
    Sur un de mes controls j'ai eu la bonne idée de le créer par le designer ce qui fait que le dispose se retrouve dans du code généré. Aucun rapport avec le sujet mais il y a peut être moyen de le virer ? Et même dans une classe qui hérite Control j'arrive pas à mettre mon dispose.

    Bon pour revenir au sujet.
    J'ai beaucoup mieux compris cette histoire. Il me reste cependant une incompréhension au niveau des dispose.

    Pour reprendre l'exemple du bitmap. Son dispose est obligatoire pour eviter le leak car bitmap utilise du code non manage genre des allocations de mémoire et tout. Mais pour une classe normale avec 3 variables dedans on a pas besoin de dispose car le code est entièrement managé et il sait direct comment supprimer la mémoire allouée à la classe. J’espère que je suis pas trop dans le faux x)

    Merci.

    Edit: Pour info j'ai trouvé le leak. Il venait d'un timer qui n'était pas disposé. Ça a l'air de rien mais au bout de beaucoup d'utilisations du logiciel ça fait plusieurs mega de leak Oo

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

Discussions similaires

  1. Problème libération de mémoire?
    Par Bartuk dans le forum C
    Réponses: 7
    Dernier message: 28/12/2005, 17h20
  2. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07
  3. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29
  4. Réponses: 25
    Dernier message: 16/07/2003, 20h41
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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