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 :

Comment stocker une copie locale dans un pointeur ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut Comment stocker une copie locale dans un pointeur ?
    Si j'écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        void addObject(myObject o, const int& i) {
            o.setI(i);
     
            this->myVector.push_back(&o);
        }
    je suppose que o (la copie locale) est détruit à la fin de la fonction.

    Donc comment est-ce que je peux conserver un pointeur dessus dans myVector de façon sûre ?
    Notez, que le fait que myVector stocke des pointeurs et non des objets n'est pas matière à débat.

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void addObject(myObject const& o, int /*const&*/ i) {
    	auto po = new myObject(o);
    	po->setI(i);
    	myVector.push_back(po);
    }
    ?

    Passer un int par ref constante est surprenant.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 773
    Par défaut
    Tiens étonnant pour toi Iradrille de ne pas proposer les std::shared_ptr

  4. #4
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par foetus Voir le message
    Tiens étonnant pour toi Iradrille de ne pas proposer les std::shared_ptr
    Probablement un bon cas d'utilisation d'unique_ptr, mais "Notez, que le fait que myVector stocke des pointeurs et non des objets n'est pas matière à débat."

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    [QUOTE=Iradrille;7833162]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void addObject(myObject const& o, int /*const&*/ i) {
    	auto po = new myObject(o);
    	po->setI(i);
    	myVector.push_back(po);
    }
    Je suis selon toi, obligé de faire une copie de la copie locale (càd le paramètre o)?
    Ok, je comprends.

    Citation Envoyé par Iradrille Voir le message
    ?

    Passer un int par ref constante est surprenant.
    J'ai pas encore vraiment fait le point sur la façon dont il convient de passer les types de base en paramètre.

    Citation Envoyé par Iradrille Voir le message
    Probablement un bon cas d'utilisation d'unique_ptr, mais "Notez, que le fait que myVector stocke des pointeurs et non des objets n'est pas matière à débat."
    Un pointeur intelligent reste acceptable, ce n'était pas précisé

  6. #6
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Je suis selon toi, obligé de faire une copie de la copie locale (càd le paramètre o) ?
    L'objet "o", est local, il est supprimé en sortant de la fonction. Si tu stockes un objet dans ton vecteur, tu en feras une copie, donc pas de problèmes.
    Ici tu stockes un pointeur, dès que tu sort de la fonction, le pointeur pointe sur un objet qui n'existe plus.

    Tu es donc obligé d'en faire une copie "persistante", en passant par un new.

    edit : ha bah tu as compris le problème pendant que je postais.

    Note tout de même que si tu ne cherches pas à en faire une copie, ceci est possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void addObject(myObject & o, int i) {
    	o.setI(i); // ce n'est à priori pas de rôle de addObject de modifier o (tu ne modifie plus une copie de o)
    	myVector.push_back(&o);
    }

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    C'est quand même dommage de devoir passer par un constructeur de copie.
    J'avais espéré qu'il y avait une astuce pour éviter le coût d'une telle opération (si on retire le setI).

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Dommage ?
    Comment penses-tu faire autrement ?
    L'objet est détruit et tu veux le garder, la seule et unique solution est de le copier quelque part où tu peux le garder. Dans la heap avec new.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    Citation Envoyé par Iradrille Voir le message
    Note tout de même que si tu ne cherches pas à en faire une copie, ceci est possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void addObject(myObject & o, int i) {
    	o.setI(i); // ce n'est à priori pas de rôle de addObject de modifier o (tu ne modifie plus une copie de o)
    	myVector.push_back(&o);
    }
    Mais lorsque l'objet passé par référence est détruit (en fin d'accolade), le pointeur stocké dans le vecteur (portant cette même adresse) n'en n'ai pas affecté ?!
    L'adresse ne peut être réatribuée ou que sais-je ?

  10. #10
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    Bonsoir,

    Mais lorsque l'objet passé par référence est détruit (en fin d'accolade), le pointeur stocké dans le vecteur (portant cette même adresse) n'en n'ai pas affecté ?!
    L'adresse ne peut être réatribuée ou que sais-je ?
    Tant que l'objet n'est pas détruit, pas de problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    myObject a;
    Conteneur ctn;
    ctn.addObject(a, 0);
    {
       myObject b;
       ctn.addObject(b, 0);
    } // b détruit ici, le pointeur devient invalide à ce moment là
    // le pointeur sur a est par contre toujours valide.
    Tout dépend de combien de temps vit l'objet. Apparemment c'est un objet temporaire qui est passé à la fonction, on est dans le cas de "b", et les pointeurs ne seront pas valides dans le vector.

    Ça n'aurait posé aucun soucis si les objets vivaient plus longtemps que le vector.

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

Discussions similaires

  1. Comment stocker une image dans une base de données sqlce ?
    Par ozeon dans le forum Développement
    Réponses: 3
    Dernier message: 11/07/2016, 20h13
  2. Réponses: 3
    Dernier message: 20/09/2010, 14h55
  3. Comment stocker une valeure ecrite dans un JFrame
    Par aphilippartd dans le forum Débuter
    Réponses: 3
    Dernier message: 12/12/2008, 18h10
  4. Comment stocker une requête sql dans une variable ?
    Par innova dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/10/2006, 10h01
  5. Comment stocker des mots clés dans une bas Mysql
    Par renofx1 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 05/01/2006, 00h57

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