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

Langage C++ Discussion :

Pointeur NULL sans l'être


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut Pointeur NULL sans l'être
    Bonsoir à tous,

    Excusez le titre du post je ne suis pas très inspiré

    Mon problème est le suivant :

    J'ai un pointeur qui est au départ initialisé à NULL, puis je fais une allocation mémoire pour un objet, le pointeur prends alors comme valeur l'adresse de l'objet. J'en viens maintenant au problème, je me rends compte que mon objet, qui est en fait un singleton, est alloué 2 fois sans avoir été détruit entre les deux allocations. Ce qui est bizarre c'est que je vérifie si le pointeur vaut NULL avant de faire l'allocation, en passant le debugger (gdb) je me suis rendu compte que le pointeur pointait encore sur la même adresse non nulle et lorsque vînt le moment de passer la condition avec laquelle je vérifie si le pointeur est à NULL, ce qui n'était pas le cas bien entendu, et ben il m'évalue tout de même l'expression comme vraie.

    Pour l'instant j'en rigole nerveusement mais je pense que bientôt ça ne me fera plus rire du tout, surtout lorsque l'objet en question est un gestionnaire de ressources

    Je vous remercie d'avance de l'aide que vous pourrez m'apporter et vous souhaite une bonne soirée.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Peut-on voir le bout de code concerné ?

    A tout hasard, ne serait-ce pas une simple erreur d'étourderie : un = à la place de == ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Malheureusement non, voici la méthode qui fait l'allocation du singleton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static inline T *Get_Instance()
    {
         if (m_pSingleton == NULL)
         {
             m_pSingleton = new T;
         }
     
         return ( static_cast<T*>(m_pSingleton) );
    }
    comme vous pouvez le voir j'utilise bien l'operateur de comparaison ==

  4. #4
    Membre éprouvé Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Par défaut
    Citation Envoyé par Sleeping Lionheart Voir le message
    est alloué 2 fois sans avoir été détruit entre les deux allocations. Ce qui est bizarre c'est que je vérifie si le pointeur vaut NULL avant de faire l'allocation, en passant le debugger (gdb) je me suis rendu compte que le pointeur pointait encore sur la même adresse non nulle et lorsque vînt le moment de passer la condition avec laquelle je vérifie si le pointeur est à NULL, ce qui n'était pas le cas bien entendu, et ben il m'évalue tout de même l'expression comme vraie.
    Attention : détruire un pointeur ne fait pas passer sa valeur à NULL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
      int *a = new int;
     
      delete a;
     
      cout << hex << a << endl;
     
      return 0;
    }
    Sortie :
    Tu dois avoir un delete non suivi de

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    oui bien entendu je sais tout ça, mais la comme je l'ai dit, le pointeur n'est pas détruit, c'est là tout le problème.
    Le pointeur pointe toujours sur la même adresse mémoire, du moins c'est ce que le debugger m'indique.

    Et de toute façon l'expression m_pSingleton == NULL devrait être fausse, ce qui n'est pas le cas.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Question bête : Tu as des DLL dans ton appli ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Oui j'en charge une dynamiquement avec LoadLibrary et tout le tintoin.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En gros, si tu as une lib statique qui déclare une variable globale ou statique (comme ton m_pSingleton), que cette lib est inclue (statiquement donc) dans n DLL dans un même programme, cette variable existe en n exemplaires dans ton programme : Bref, c'est le bordel.

    Si tu es dans ce cas, trois solutions (du moins à ma connaissance) :
    - Déclarer une telle variable non plus dans une lib statique, mais dans une lib dynamique
    - Supprimer les libs dynamiques pour tout lier statiquement
    - Utiliser un autre mécanisme qu'une variable statique pour stocker cette information, comme par exemple une zone de mémoire partagée nommée (ici, l'important n'est pas le partage, mais le nommage, qui fait qu'on peut y accéder depuis n dlls sans soucis).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    OK, en fait je n'ai pas précisé les choses mais je vais le faire tout de suite :

    Mon appli utilise 3 libs statiques et une en dynamique chargée depuis le code. L'objet qui est un singleton est créé à partir d'une classe générique comme vous l'avez sûrement constaté. La dll dynamique a été construite elle-même sur des libs liées en dynamique et sur une des 3 libs statique évoqués précédement. De plus une des libs statiques utilise tinyxml, donc je me retrouve avec une 4ème lib statique.

    Bref c'est tout de même un beau bordel.

    Dois-je vraiment passer toutes mes libs statique en dynamique ?

    L'objet dont on parle (le gestionnaire de ressource) n'est pas le seul singleton créé avec cette méthode. Il doit y en avoir 4 à 5 autres et ceux-là ne rencontrent pas le problème.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 57
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    - Utiliser un autre mécanisme qu'une variable statique pour stocker cette information, comme par exemple une zone de mémoire partagée nommée (ici, l'important n'est pas le partage, mais le nommage, qui fait qu'on peut y accéder depuis n dlls sans soucis).
    Salut. Pratiquement, comment faire cette zone de memoire partagee ?

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Avec des appels spécifiques à l'OS. De tête, sous windows, CreateFileMapping et MapViewOfFile.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Bon je vais essayer de me débrouiller, merci quand même de votre aide.

    Bonne journée.

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Et si tu suis ce qu'a expliqué JolyLoic, pense à inclure l'ID du processus dans le nom de ta mémoire "partagée".
    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.

Discussions similaires

  1. conserver ma liste d'objets sans Pointeur Null ...
    Par comme de bien entendu dans le forum Général Java
    Réponses: 8
    Dernier message: 24/03/2006, 11h55
  2. [PORT COM] RS485 et pointeur null...
    Par floanne dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 20/02/2006, 11h00
  3. get => pointeur null apres fermeture d'une sous-fenetre
    Par gorgonite dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 11/02/2006, 21h42
  4. [Info][Mémoire] utilisée pour un pointeur null
    Par thomas_strass dans le forum Langage
    Réponses: 14
    Dernier message: 04/11/2004, 12h48
  5. Réponses: 4
    Dernier message: 06/04/2004, 21h57

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