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 :

pointeur en paramètre de fonction et appel avec new


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut pointeur en paramètre de fonction et appel avec new
    Bonjour,

    prenons le code suivant:
    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
    struct Dum
    {
       // des choses ici, mais disons que Dum est un type complexe (non POD)
    };
     
    class Foo
    {
    public:
       void AddDum( Dum * d )
       {
          dums.push_back(d);      
       }
     
    private:
       vector<Dum*> dums;
    };
     
    int main()
    {
       Foo foo;
       foo.AddDum( new Dum() ); // <----------------------------- ici
       // ...
    }
    je ne comprend pas ce qu'il se passe lors de l'appel à Adddum (avant-dernière ligne du code). Il y a création d'une temporaire non nommée je crois, mais y a-t-il une copie? Y a-t-il une fuite mémoire? Est-ce que quelqu'un en sait plus?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Yo parrain.


    du pointeur oui mais pas du pointé.

    C'est C# qui te fait du mal? :p

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Haaaa oui effectivement. Oui c'est sans doute le C# qui me fait perdre le nord en fait il y a plusieurs types de pointeurs en C#, donc ça m'embrouille...

    Oui en fait, je crois que le code ci-dessus fait bien ce que je veux, c'est à dire qu'à la fin, c'est bien la classe Foo qui est propriétaire de l'objet créé sur le tas.

    Promis, demain j'arrête (le C#)
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Haa mais attend, alors que se passe-t-il si à la place d'un pointeur on a une référence?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Foo::AddDum( Dum & dum )
    {
       dums.push_back( dum );
    }
     
    main()
    {
       foo( Dum() );
       // ...
    }
    Il y a combien de copies là? (il y a en au moins une dans le push_back non? )
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonsoir,

    Normalement, ca ne compile pas. Tu ne peux pas construire une lref à partir d'une rvalue, sauf si la lref est "constante". Et dans ce cas oui, une construction (Dum()) et une copie normalement (push_back).

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par r0d Voir le message
    Il y a combien de copies là? (il y a en au moins une dans le push_back non? )
    oui la variable temporaire sera détruite.

    Normalement, ca ne compile pas.
    Sous GCC non mais sous visual oui. Je me suis fait avoir assez souvent

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par yan Voir le message
    Sous GCC non mais sous visual oui. Je me suis fait avoir assez souvent
    Avec un warning quand même non ?
    Find me on github

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Avec un warning quand même non ?
    non :/
    en tous cas pas sous 2010

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/07/2008, 10h46
  2. Pointeurs et paramètres de fonction
    Par tom31 dans le forum Débuter
    Réponses: 2
    Dernier message: 12/01/2008, 20h58
  3. appel procédure avec paramètres ds fonction
    Par cpattin dans le forum VB.NET
    Réponses: 7
    Dernier message: 14/06/2007, 22h11
  4. Réponses: 5
    Dernier message: 31/07/2006, 10h17
  5. Réponses: 10
    Dernier message: 04/01/2006, 16h57

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