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

Windows Forms Discussion :

[c#]Comment forcer la destruction d'un objet précédemment créé?


Sujet :

Windows Forms

  1. #1
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut [c#]Comment forcer la destruction d'un objet précédemment créé?
    Bonjour...

    Suite à l'instanciation d'une classe (dans laquelle je fais un DLLImport->appel DLL Win32), je souhaite détruire l'objet associer pour relancer une nouvelle instanciation (nécessaire pour l'initialisation de la DLL).

    Peut on forcer le mécanisme de destruction d'objet? (Peut on forcer le Garbage Collector à agir à un instant "t"?).

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    C'est possible il faut juste forcer ton programme à attendre la GC.

    source msdn
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          A a = new A();
          a = null;
          GC.Collect();
          GC.<a href="http://msdn2.microsoft.com/fr-fr/library/system.gc.waitforpendingfinalizers.aspx" target="_blank">WaitForPendingFinalizers</a>();

  3. #3
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Ok merci pour l'aide mehdi_tn (très intéressant ce GC.Collect). Mais (tu vasdire que je suis parano ) mais comment etre sur que la classe n'existe plus en mémoire. Car après le "a=null" il est claire que si j'utilise de nouveau "a" j'aurais une erreur de pointage.
    J'ai donc fais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
         A a = new A();
         A b = a;  
          b=a;
          a = null;
          GC.Collect();
          GC.WaitForPendingFinalizers();
          a=b;
    et la je peux encore utiliser "a"...ceci n'est, a mon avis, pas normal si le garbage collector avais fais sont travail 'a' devrait pointer sur n'importe quoi non?


  4. #4
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Oui ce n'est normal, elle est assez intelligente la GC. je t'explique, par analogie à la GC de java mais ca doit fonctionner de la meme maniere, un objet est éligible à la destruction si aucune reference ne pointe vers l'objet. Dand ton cas si tu mes a à null, b pointe encore vers l'objet A, donc la GC ne va pas detruire l'objet.
    Pour mettre un terme à tes délires paranoïaques , mes b à null et reteste ton programme. et si tu maitrise l'anglais regarde la deuxieme partie du lien msdn, il explique à peu pres le meme cas.

    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 118
    Par défaut
    Citation Envoyé par Jayceblaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
         A a = new A();
         A b = a;  
          b=a;
          a = null;
          GC.Collect();
          GC.WaitForPendingFinalizers();
          a=b;
    Salut ,

    Est ce que c'est la meilleur façon de le faire ? je doute !
    Il n'y a pas d'opérateur comme le "delete" en c++ ?

  6. #6
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    L'utilisation de using n'aurait pas suffit ? Le problème en appelant GC.Collect() c'est que ca fait un Collect pour tout le domaine d'application et non seulement pour l'objet qu'on cherche à détruire.

    Par contre, il faut évidemment prendre garde à ce qu'a expliqué Mehdi Feki, seul les objets qui n'ont plus aucune références sont véritablement détruits.

    Et pour répondre à Hello_World, non il n'y a pas de "delete" en C#. La destruction des objet est gérée par le garbage collector qui fait son boulot quand ca lui chante (on ne peut prévoir quand il va y avoir collection des objets a détruire). Au mieux, on peux juste lui demander de faire son boulot maintenant tout de suite.

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

Discussions similaires

  1. Forcer la destruction d'un objet
    Par Higgins dans le forum Langage
    Réponses: 8
    Dernier message: 19/12/2013, 19h57
  2. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  3. Réponses: 2
    Dernier message: 13/10/2007, 01h55
  4. [Struts]comment forcer un Forward ?
    Par njac dans le forum Struts 1
    Réponses: 4
    Dernier message: 13/10/2004, 15h02
  5. Comment detecter le type d'un objet?
    Par nickylarson dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/06/2003, 15h23

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