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 :

SWAP IDIOM COPY CONSTRUCTOR


Sujet :

C++

  1. #21
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    une petite question :

    dans le code de boost::shared_ptr l'operateur d'affectation est defini ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        shared_ptr & operator=(shared_ptr const & r) // never throws
        {
            px = r.px;
            pn = r.pn; // shared_count::op= doesn't throw
            return *this;
        }
    Pourquoi pas de swap ici ?

  2. #22
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Parce que, justement, le but poursuivi par un shared_ptr est d'assurer qu'une adresse mémoire est correctement partagée entre deux instances deux celui-ci.

    Ce qui se passe avec le shared_ptr, c'est que tu as un compteur de référence (c'est en réalité une valeur numérique déclarée statique, de manière à s'assurer que toutes les instances de shared_ptr utilisent la même), incrémentée lors de la copie et décrémentée lors de la destruction.

    La libération de la mémoire n'intervenant que lorsque ce compteur de référence revient à 0 dans le destructeur

    Pour avoir confirmation de ce que j'expose, regarde:
    1- la définition de shared_ptr (tu y trouvera une variable statique)
    2- le constructeur par copie du shared_ptr (tu remarquera l'incrémentation de la variable statique)
    3- le destructeur du shared_ptr (tu y remarquera la décrémentation de la variable statique, et que la libération du pointeur s'effectue si... la variable statique est à 0 )
    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

  3. #23
    Invité
    Invité(e)
    Par défaut
    Sauf erreur la variable n'est pas statique puisqu'un code tel que celui est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
       shared_ptr<int> ptr1(new int(524));//compteur == 1
       shared_ptr<int> ptr2(new int(123));//compteur == 2
    }//~ptr2 compteur == 1
    //~ptr1 compteur == 0;
    Si on utilisait une variable statique ptr2 ne serait pas détruit(puisque le compteur est encore à 1).

  4. #24
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Et pourtant, c'est le seul moyen d'assurer un comptage de référence correct et cohérent (autrement, tu risquerais de voir la mémoire allouée libérée lors de la destruction du premier objet créé, alors que les suivant sont encore utilisés )

    Maintenant, je n'ai pas été vérifier le code, mais je ne serais pas étonné qu'il y ait une "astuce" quelconque grâce à l'utilisation des template
    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

  5. #25
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    oui je pense pas que ça soit static

  6. #26
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Joe Dralliam Voir le message
    Sauf erreur la variable n'est pas statique puisqu'un code tel que celui est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
       shared_ptr<int> ptr1(new int(524));//compteur == 1
       shared_ptr<int> ptr2(new int(123));//compteur == 2
    }//~ptr2 compteur == 1
    //~ptr1 compteur == 0;
    Si on utilisait une variable statique ptr2 ne serait pas détruit(puisque le compteur est encore à 1).
    Ben si c'est le principe d'un compteur de référence. (basiquement, y'a des trucs plus compliqué dans l'implémentation de boost). Un compteur statique, et le dtor / ctor etc décrémente / incrémente la variable

  7. #27
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par Joe Dralliam Voir le message
    Sauf erreur la variable n'est pas statique puisqu'un code tel que celui est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
       shared_ptr<int> ptr1(new int(524));//compteur == 1
       shared_ptr<int> ptr2(new int(123));//compteur == 2
    }//~ptr2 compteur == 1
    //~ptr1 compteur == 0;
    Si on utilisait une variable statique ptr2 ne serait pas détruit(puisque le compteur est encore à 1).
    Mais là on a deux pointeurs distincts ...
    On a un seul compteur ? pas deux ?

  8. #28
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Deux.

  9. #29
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut

  10. #30
    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 : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Et pourtant, c'est le seul moyen d'assurer un comptage de référence correct et cohérent (autrement, tu risquerais de voir la mémoire allouée libérée lors de la destruction du premier objet créé, alors que les suivant sont encore utilisés )

    Maintenant, je n'ai pas été vérifier le code, mais je ne serais pas étonné qu'il y ait une "astuce" quelconque grâce à l'utilisation des template
    Je viens de jeter un coup d'oeil rapide et apparemment non, il n'y a pas de static ni "d'astuce" à coup de template.

    Le shared pointer contient juste un pointeur sur le compteur de référence.

    Citation Envoyé par guillaume07 Voir le message
    dans le code de boost::shared_ptr l'operateur d'affectation est defini ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        shared_ptr & operator=(shared_ptr const & r) // never throws
        {
            px = r.px;
            pn = r.pn; // shared_count::op= doesn't throw
            return *this;
        }
    Pourquoi pas de swap ici ?
    Tout d'abord, px étant un simple pointeur l'affectation ne lève pas d'exception et au vu du commentaire, l'affectation de pn ne throw pas non plus, la simple affectation comme ici fonctionne bien.

    En outre dans la version 1.43 (la dernière) de boost, l'opérateur d'affectation de boost::shared_ptr est bel et bien implémenter via le copy and sawp.

  11. #31
    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
    Par défaut
    Je n'ai pas pris le temps de revérifier mais je suis rassuré par la réponse de gl. Je ne vois pas trop l'intérêt d'une variable statique. Le compteur de référence est, si ma mémoire ne me trahi pas trop, un compteur alloué dynamiquement et associé aux différentes instances de shared_ptr qui partagent le même pointeur. D'ailleurs, intuitivement, c'est comme ça que je procéderais au premier abord.

  12. #32
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ouaip c'est ça. Autant pour moi, j'avais laissé le cerveau à coté du clavier.

  13. #33
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ça arrive

Discussions similaires

  1. probleme avec copy constructor
    Par alamata dans le forum C++
    Réponses: 15
    Dernier message: 06/11/2014, 09h34
  2. vector et copy constructor
    Par r0d dans le forum Langage
    Réponses: 5
    Dernier message: 27/12/2012, 20h49
  3. copy constructor/ assignement/ destructor
    Par lafrankette dans le forum Débuter
    Réponses: 5
    Dernier message: 24/08/2009, 19h09
  4. [debutant]probleme avec le copy constructor
    Par Battosaiii dans le forum Débuter
    Réponses: 10
    Dernier message: 09/11/2005, 11h33
  5. Copy constructor ?
    Par Keyser dans le forum MFC
    Réponses: 4
    Dernier message: 17/02/2004, 16h33

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