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 :

CONVERSION_Smtptr_ptr avec yasper !?


Sujet :

C++

  1. #1
    Membre régulier Avatar de MenshaKaine
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Points : 81
    Points
    81
    Par défaut CONVERSION_Smtptr_ptr avec yasper !?
    Dans le code joint dans la première partie, j'avais aucune erreur, ca passait la compilation sans warning !? par contre à l'exécution => crash ...

    Avec la deuxième version plus logique du point de vue des types tout va bien ...

    Ma question est-ce normal de passer la compilation dans les deux cas sans le moindre warning !?

    Que se passe-t-il dans le premier cas !?

    je n'ai pas encore trouvé si quelqu'un a une idée merci de la proposer

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    // CONVERSION_Smtptr_ptr.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include "Yasper.h" 
     
    #include <set>
     
    /////////////////// ERREUR ///////////////////
    /**/
    class atype;
     
    typedef yasper::ptr<atype> aTypeSmtPtr;
     
    class atype
    {
       std::set<aTypeSmtPtr> m_sspatypes;
     
    public:
       void add( atype* _other )
       {
          m_sspatypes.insert( _other );
       };
    };
     
    void else_where(void)
    {
       aTypeSmtPtr typeSmtPtr0( new atype() );
       aTypeSmtPtr typeSmtPtr1( new atype() );
     
       typeSmtPtr0->add( typeSmtPtr1 );
    }
    /**/
    //////////////////      OK    ///////////////////
    /*
    class atype;
     
    typedef yasper::ptr<atype> aTypeSmtPtr;
     
    class atype
    {
       std::set<aTypeSmtPtr> m_sspatypes;
     
    public:
       void add( aTypeSmtPtr _other )
       {
          m_sspatypes.insert( _other );
       };
    };
     
    typedef yasper::ptr<atype> aTypeSmtPtr;
     
    void else_where(void)
    {
       aTypeSmtPtr typeSmtPtr0( new atype() );
       aTypeSmtPtr typeSmtPtr1( new atype() );
     
       typeSmtPtr0->add( typeSmtPtr1 );
    }   
    */
    ///////////////////////////////////////////////////
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
       ::else_where();
     
       return 0;
    }

  2. #2
    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,
    Il y un truc de bancale dans Yasper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	template <typename Y>
    	operator Y*() const
    	{
    		return static_cast<Y*>(rawPtr);  
    	}
    Cela te fait une conversion implicite de aTypeSmtPtr vers atype* dans la ligne typeSmtPtr0->add( typeSmtPtr1 ) de else_where. Du coup le même pointeur se retrouve dans deux smart pointeurs ne partageant pas l'info : dans typeSmtPtr1 et typeSmtPtr0::sspatypes. Donc il est libéré deux fois
    Normal que le compilateur ne dise rien, ce code est valide !

    Pourquoi ne pas utiliser un pointeur intelligent éprouvé : Boost.SmartPtr (boost::shared_ptr) ?

    [Edit] D'ailleurs, ils préviennent bien dans Yasper :
    The last point can be dangerous, since yasper permits risky (yet useful) actions (such as assignment to raw pointers and manual release) disallowed by other implementations. Be careful, only use those features if you know what you're doing!
    A tes risques et périls

  3. #3
    Membre régulier Avatar de MenshaKaine
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Points : 81
    Points
    81
    Par défaut
    Je n'avais pas repérer ce truc bancale ... et donc je ne voyais pas la possibilité de conversion implicite qui pique les yeux.

    En tout cas merci pour ta réponse.

    Pour te répondre, je travail sur un projet industriel, ou comme d'habitude, on ne veut pas intégrer la lib boost ... et c'est dure a vivre ;-)

  4. #4
    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
    Citation Envoyé par MenshaKaine Voir le message
    Je n'avais pas repérer ce truc bancale ... et donc je ne voyais pas la possibilité de conversion implicite qui pique les yeux.

    En tout cas merci pour ta réponse.

    Pour te répondre, je travail sur un projet industriel, ou comme d'habitude, on ne veut pas intégrer la lib boost ... et c'est dure a vivre ;-)
    A ce moment, fais-toi une classe de pointeurs intelligents (vraiment intelligent) en t'en inspirant. Ou nettoies franchement celle de yasper pour enlever ces petites choses en plus qui ne sont que des nids à bugs.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par MenshaKaine Voir le message
    Pour te répondre, je travail sur un projet industriel, ou comme d'habitude, on ne veut pas intégrer la lib boost ... et c'est dure a vivre ;-)
    Si vous bossez avec VC++ 2008, c'est dispo "nativement" depuis le SP1 via le TR1.

  6. #6
    Membre régulier Avatar de MenshaKaine
    Inscrit en
    Juin 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Juin 2009
    Messages : 68
    Points : 81
    Points
    81
    Par défaut
    bonjour, voir bonsoir,

    je n'aurais pas le temps d'écrire un code de smart pointer ... hélas ... ça m'aurait permit de me "booster" un peu en compétence ^^.

    je pense commenter les parties de code qui convertissent implicitement pour au moins repérer ces cas.

    Coter VS 2008, on est en VS 2005 et on doit être multi-plateforme et donc respecter le standard ...

    je demandais si ce n'était pas possible de trouver une autre implémentation libre ... ou intégrer simplement juste les smart pointer de boost ... mais d'après ce que j'en ai entendu parler c'est juste pas simple !!!!

  7. #7
    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
    Citation Envoyé par MenshaKaine Voir le message
    je demandais si ce n'était pas possible de trouver une autre implémentation libre ... ou intégrer simplement juste les smart pointer de boost ... mais d'après ce que j'en ai entendu parler c'est juste pas simple !!!!
    Salut,
    Télécharger boost et n'utiliser que boost::smart Ptr, c'est possible. Ca ne nécessite pas de compiler boost et ça ne t'ajouteras pas plus que ça .

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Faut quand même faire un travaille d'élagage car y'a pas mal d'include d'autres parties de boost . (déjà y'a tout les workaroung, config etc, checked_delete.hpp aussi apparemment) mais bon y'a moyen d'arriver à sortir tout ça du contexte amha.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par MenshaKaine Voir le message
    Coter VS 2008, on est en VS 2005 et on doit être multi-plateforme et donc respecter le standard ...
    Ben justement, le tr1 c'est standard. VC++ et g++ le suportent, pour le reste tu as boost::tr1 (qui utilise boost::shared_ptr)

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

Discussions similaires

  1. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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