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

SL & STL C++ Discussion :

[multiset.insert] comportement étrange


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut [multiset.insert] comportement étrange
    Bonjour tout le monde,

    prenons le bout de 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
    #include <set>
    #include <iostream>
    using namespace std;
     
    struct Element
    {
       Element(int n):num(n){cout<<"new"<<endl;}
       ~Element(){cout<<"delete"<<endl;}
       int num;
       bool operator < ( const Element & elt ) const { return ( num < elt.num ); }
    };
     
    int main()
    {
       multiset<Element> theSet;
       cout << "--> insert" << endl;
       theSet.insert( Element(1) );
       cout << "--> clear" << endl;
       theSet.clear();
       cout << "--> termine" << endl;
       return 0;
    }
    La sortie est:
    --> insert
    new
    delete
    --> clear
    delete
    --> termine
    Nous voyons donc que:
    -> lors de l'insertion, le destructeur est appelé
    -> on a, en tout, 1 new et 2 delete

    Comprenez-vous ce qu'il se passe? Est-ce normal?

  2. #2
    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 : 50
    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
    Par défaut
    A priori, rien de choquant... Quand on fait une classe instrumentée comme ça, ne pas oublier d'instrumenter aussi le constructeur de copie et l'opérateur=.

    A priori :
    Tu crée le temporaire => new
    Il est copié dans le tableau => pas d'affichage
    Puis est détruit => delete
    Clear
    La copie dans le tableau est détruite => delete
    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.

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    En effet, c'est bien cela. J'ai modifié mon code ainsi:
    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
    struct Element
    {
       //constructeur
       Element(int n):num(n){cout<<"new"<<endl;} 
     
       // constructeur par copie
       Element( const Element & elt ) { cout<<"copy constr"<<endl;
          num = elt.num; } 
     
       // operateur d'affectation (je ne retourne rien, c'est voulu)
       void operator = ( const Element & elt ){ cout<<"operator ="<<endl;  
          num = elt.num; }; 
     
       // destructeur
       ~Element(){cout<<"delete"<<endl;}
     
       // operateur de comparaison
       bool operator < ( const Element & elt ) const { return ( num < elt.num ); }
     
       // donnee
       int num;
    }
    et effectivement, avec le même main, j'obtiens la sortie:
    --> insert
    new
    copy constr
    delete
    --> clear
    delete
    Mais du coup, n'y a-t-il pas moyen d'éviter cette copie?

  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 : 50
    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
    Par défaut
    Citation Envoyé par r0d Voir le message
    Mais du coup, n'y a-t-il pas moyen d'éviter cette copie?
    A part attendre C++0x (j'ai entendu dire que la prochaine version de gcc en implémentait une partie) ? Je ne pense pas. Mais je ne suis pas hyper à jour sur le sujet.
    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.

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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