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 :

passage d'un pointeur à un constructeur


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut passage d'un pointeur à un constructeur
    Bonjour,

    J'ai une question qui me turlupine depuis peu.
    Supposons que j'ai un objet de classe A qui est une portée au delà de la classe B. B doit pouvoir utiliser cet objet, je le passe donc à son constructeur sous forme de pointeur (il me faut l'objet, pas une copie), qui l'assigne à un membre de sa classe(appelé m_a).
    Dans ce cas, dans le destructeur de B, il ne faut pas faire delete m_a, sinon on limite la portée de l'objet de classe A ce que l'on ne souhaite pas.

    Ma question est donc: est ce que l'emplacement mémoire de m_a (le pointeur en lui même, et pas l'objet qu'il pointe) est libéré automatiquement lors de la destruction de B ou faut il le libérer manuellement et si oui comment ?

    Je vous remercie par avance pour votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    m_a repasse bien a NULL lors de l'appel du destructeur de B. Néanmoins, rien ne t'empêche de préciser cette affectation explicitement dans le code du destructeur.
    A mon avis, tu peux également envisager l'affectation du pointeur m_a dans une autre méthode que dans le constructeur, comme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class B
    {
       public :
          B() {this->m_a=NULL;}
          ~B() {this->m_a=NULL;}
     
          init(A* a)  {this->m_a=a;}
     
       private :
          A* m_a;
    };
    Cordialement,
    Agamitsudo.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse agamitsudo.

    m_a étant repassé à NULL, l'emplacement mémoire est donc disponible pour d'autres données ?

  4. #4
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    m_a n'est pas repassé à NULL !

    Simplement, l'emplacement mémoire de l'ensemble de l'objet de type B est libéré. C'est exactement pareil que si tu mettais un int dans B. Lors de la destruction d'un objet de type B, l'espace mémoire pour le int serait libéré.
    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.

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci pour vos réponse.

    Je m'en doutais un peu, mais ca me semblais difficile à vérifier et je n'ai rien trouver sur le sujet.

    En fait m_a se comporte exactement comme une propriété normale de la classe B (comme si ce n'était pas un pointeur).

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par akira215 Voir le message
    Merci pour vos réponse.

    Je m'en doutais un peu, mais ca me semblais difficile à vérifier et je n'ai rien trouver sur le sujet.

    En fait m_a se comporte exactement comme une propriété normale de la classe B (comme si ce n'était pas un pointeur).
    Effectivement...

    Il faut, cependant, prendre un autre problème en ligne de compte:

    Si, pour une raison ou une autre, l'objet pointé par m_a est détruit avant... l'instance de B à laquelle il est assigné, m_a ne sera pas "mis à jour" (pour pointer vers NULL).

    La conséquence directe sera... que toute tentative d'accès à un membre de m_a après la destruction de l'objet par lui pointé enverra le programme... dans les cordes.

    Il s'agira donc de veiller, soit à ce que l'objet pointé par m_a signale à tous les objets de types B qui le référencent un signal leur indiquant qu'il est détruit, soit penser à utiliser les pointeurs intelligents, pour qu'ils puissent gérer cela " par eux même" (il y a un tuto qui leur est consacré )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Et pourquoi pas une référence?

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 17/07/2007, 08h29
  2. Passage VC2003->VC2005 TypeDef et Constructeur
    Par alexadvance dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 27/02/2007, 11h04
  3. Réponses: 7
    Dernier message: 22/10/2006, 18h51
  4. Réponses: 7
    Dernier message: 02/12/2005, 13h02
  5. Réponses: 5
    Dernier message: 21/11/2005, 01h40

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