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 :

destruction d'un void *, je voudrais que le destructeur soit appelé si il existe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Par défaut destruction d'un void *, je voudrais que le destructeur soit appelé si il existe
    voila ce que j'espère faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void *G_p = 0;
     
    void enregistrer(void *p)
    {
      G_p = p;
    }
     
    void detruire()
    {
      delete G_p;    
    }
     
    enregistrer(new A()); 
    detruire();  //--> ~A() n'est pas appelé (normal)
    comment puis-je faire pour que le destructeur soit appelé (si il existe)?

    je pourrais écrire aussi :
    enregistrer(new int);
    enregistrer(new CString);
    etc...

  2. #2
    Membre éprouvé Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Par défaut
    Salut,
    tu peux t'en sortir avec des templates. si le type est bien defini delete appellera le destructeur.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,

    Citation Envoyé par minitchoup Voir le message
    comment puis-je faire pour que le destructeur soit appelé (si il existe)?
    Tu n'as pas d'autre choix que typer correctement ton objet.

    Pour rester dans ce que tu as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void *G_p = 0;
     
    void enregistrer(void *p)
    {
      G_p = p;
    }
    template<typename T>
    void detruire()
    {
      delete reinterpret_cast<T*>(G_p);    
    }
     
    enregistrer(new A()); 
    detruire<A>();  //--> ~A()
    Cependant, ça ne marche pas pour un tableau !

    Cependant, le bout de code que tu montre est très hasardeux : l'utilisation de variable globale n'est pas recommandée; dans ta fonction enregistrer, tu ne vérifie pas si ton pointeur n'est pas déjà alloué; l'utilisation de void* n'est pas recommandée (il vaut mieux rester dans du fortement typé); si tu oublies d'appeler detruire, ton pointeur n'est pas libéré.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Typiquement, pour remédier à ce problème, je restreindrais l'enregistrent à des classes héritant d'une classe parente, laquelle classe parente possèderait un destructeur virtuel...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Par défaut
    merci pour vos réponses.

    en fait
    1/ je ne peux rien présupposer sur le type de pointeur qui est passé à 'enregistrer'.
    2/ ici j'ai simplifié le pb en stockant le pointeur dans une variable globale, mais en réalité c'est dans une liste qu'il sera stocké (list<void *>)

    en fait je crois que c'est sans solution...

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par minitchoup Voir le message
    en fait je crois que c'est sans solution...
    Plus ou moins. Si tu réécris un pointeur intelligent dérivant d'une classe parente (en gros un boost_shared_ptr<> mais avec l'héritage, tu peux t'affranchir du <>), ça devrait pouvoir fonctionner.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Hé oui: Tu ne peux rien faire de dynamique avec un simple void*.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Par défaut
    peux t'on trouver une solution en mettant en œuvre RTTI et en stockant éventuellement une autre information en plus du pointeur (son type)?

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

Discussions similaires

  1. Voudrais que Firefox me demande quoi faire avec les .pdf
    Par nicolas83 dans le forum Firefox
    Réponses: 2
    Dernier message: 23/10/2008, 14h14
  2. Je voudrais que mes images soit redimensionné automatiquement.
    Par ghostfile dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 20/02/2008, 18h29
  3. Je voudrais que mon site ressemble à celui-ci !
    Par habasque dans le forum Mon site
    Réponses: 1
    Dernier message: 07/07/2007, 19h00
  4. Réponses: 9
    Dernier message: 07/10/2006, 10h54

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