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

Bibliothèques Discussion :

Allocation implicite de la memoire lors d'une agrégation par pointeur


Sujet :

Bibliothèques

  1. #1
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut Allocation implicite de la memoire lors d'une agrégation par pointeur
    Bonjour,

    J'ai mis un titre un peu pompeux, mais ma question est vraiment simple.

    J ai deux classes Base et Compo

    La classe Base à un pointeurs vers Compo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Base
    {
        public:
            Base();
            virtual ~Base();
     
            Compo* m_Compo;
     
    };
    La classe Compo ne contient qu'une fonction speak qui afiche "Compo::speak"

    Dans mon main, je fait cela :
    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 "Base.h"
     
    int main()
    {
        Base oBase;
        oBase.m_Compo->speak();
     
        Base* pBase = new Base;
        pBase->m_Compo->speak();
     
        return 0;
    }
    Ce qui me trouble, c'est que ce code marche parfaitement (pour une fois qu'on parle d'un truc qui fonctionne sur un forum d'entraide ).
    J'obtient :

    Compo::speak
    Compo::speak

    Question : Le seul et unique new du projet se trouvant dans le main, G++ alloue il la mémoire implicitement ? j ai tres clairement utilise le pointeur Base::m_Compo sans allouer de mémoire. J'avais pris l'habitude (mauvaise ? ) d'écrire dans le constructeur de m_Compo = new Compo; je constate que cela est parfaitement inutile....
    all your base are belong to us.

  2. #2
    Membre régulier Avatar de saidus
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46

    Informations forums :
    Inscription : Octobre 2004
    Messages : 165
    Points : 89
    Points
    89
    Par défaut
    C'est peut etre la chance ou le compilateur n'est pas parfaitement compatible avec le standard
    normalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Base
    {
        public:
            Base(){ m_Compo = new Compo;};
            virtual ~Base(){ delete m_Compo;};
     
            Compo* m_Compo;
     
    };
    Dhukmucmur Vernedh

  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
    Il manque ta déclaration de la classe Compo et de speak.
    Le code suivant marche:
    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
    class Compo
    {
    public:
     
    	static void speak(){printf("speak");}
    };
     
    class Base
    {
        public:
     
            Compo* m_Compo;
     
    };
     
    int main(int argc, _TCHAR* argv[])
    {
        Base oBase;
        oBase.m_Compo->speak();
     
        Base* pBase = new Base;
        pBase->m_Compo->speak();
     
     
     
    	return 0;
    }
    En effet, m_Compo->speak est résolu en Compo::speak.

    Par contre le code suivant plante chez moi:
    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
    class Compo
    {
    public:
     
    	void speak(){printf("speak");}
    };
     
    class Base
    {
        public:
     
            Compo* m_Compo;
     
    };
     
    int main(int argc, _TCHAR* argv[])
    {
        Base oBase;
        oBase.m_Compo->speak();
     
        Base* pBase = new Base;
        pBase->m_Compo->speak();
     
     
     
    	return 0;
    }
    Donc la clef doit être dans ta déclaration de Compo

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/03/2010, 19h04
  2. Probleme inversion jour et mois lors d'une copie par macro
    Par alex830001 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/09/2008, 15h29
  3. Réponses: 0
    Dernier message: 11/03/2008, 15h18
  4. Formulaire bloqué lors d'une ouverture par macro.
    Par Monsieur Peck dans le forum IHM
    Réponses: 6
    Dernier message: 16/06/2006, 17h41
  5. Réponses: 2
    Dernier message: 19/05/2006, 12h22

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