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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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