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++

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Points : 3
    Points
    3
    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 régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    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
    Points : 13 017
    Points
    13 017
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    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...

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Points : 3
    Points
    3
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Hé oui: Tu ne peux rien faire de dynamique avec un simple void*.

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Points : 3
    Points
    3
    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)?

  9. #9
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu fais des list<PointeurIntelligent*> avec des :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class PointeurIntelligent
    {
    virtual ~PointeurIntelligent(){}
    };
     
    template<class Type>
    class MonPointeurIntelligent : public PointeurIntelligent
    {
    /* Recopie de boost_shared_ptr si tu veux*/
    };
    A la fin, tu delete ton pointeur qui se chargera de faire un delete correct sur tes données.

    Le RTTI ne fonctionne pas sur du void*.

  10. #10
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    merci à tous et plus particulièrement à Matthieu Brucher.

    c'est La solution.

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    J'ajoute aussi que le résultat textuel du RTTI n'est pas garanti par la norme, il peut varier d'un compilateur à l'autre, ce qui oblige à comparer les objets avec des objets de référence dont on est sûr du type.

  12. #12
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Hé oui: Tu ne peux rien faire de dynamique avec un simple void*.
    Plus généralement, sauf dans des cas très extrêmes, on ne fait pas réellement de C++ quand on utilise void*.

    On résoud toujours les problèmes soit avec des templates, soit avec une bonne hiérarchie de classes.

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Sinon tu peux aussi utiliser boost::any.

+ 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