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 :

Valeur innatendue avec std::queue::front()


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut Valeur innatendue avec std::queue::front()
    Bonjour!
    Pour testes quelques petits truc j'ai écrit un petit prog:
    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
     
    #include <glib.h>
     
    class B;
     
    class A
    {
        public:
     
        /*  constructeurs   */
        A();
        virtual ~A();
     
        protected:
     
        /*  Membres protégés    */
        B* m_pb;
    };
    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
     
    #include <iostream>
    #include <glib.h>
    #include <queue>
     
    class B
    {
        friend class A;
        public:
        B();
        virtual ~B();
        protected:
     
        /*  Membres protégés    */
        std::queue<int> m_qint;
     
        /*  Fonctions protégées */
        bool _push(int);
        void _affiche();
    };
    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
    #include "CA.h"
    #include "CB.h"
     
    /*  construct et destruct   */
    A::A():m_pb(new B)
    {
        char fin='n';
        int i;
        do{
        std::cout<<"Entrez un entier (Attention aucun test d'erreur impléménté!!):";
        std::cin>>i;
        m_pb->_push(i);
        std::cout<<"Voulez-vous continuer?(o/n):"<<std::endl;
        std::cin>>fin;
        }while(fin!='n' && fin!='N');
        std::cout<<"Voulez-vous dépiler le conteneur?(o/n):";
        std::cin>>fin;
        if(fin=='o' || fin=='O')m_pb->_affiche();
    }
    A::~A(){}
    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
    #include "CB.h"
     
    /* construct et destruct    */
    B::B(){}
    B::~B(){}
     
    /* Fonctins protégées   */
    void B::_affiche()
    {
        while(m_qint.size())
        {
            std::cout<<"Message de B:\nTaille du conteneur: "<<m_qint.size();
            std::cout<<"\nJe dépile mon conteneur:\t"<<m_qint.front()<<std::cout<<std::endl;
            m_qint.pop();
        }
    }
     
    /* Fonctions */
    bool B::_push(int i)
    {
        m_qint.push(i);
        return true;
    }
    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
    #include <iostream>
    #include <queue>
     
    #include "CA.h"
     
    int main()
    {
        std::queue<int> q;
        q.push(1);
        q.push(2);
        q.push(3);
        while(q.size()){
            std::cout<<"taile de q:"<<q.size()<<"\nelement:\t"<<q.front()<<std::endl;
            q.pop();
        }
        A a;
        return 0;
    }
    taile de q:3
    element: 1
    taile de q:2
    element: 2
    taile de q:1
    element: 3
    Entrez un entier (Attention aucun test d'erreur impléménté!!):1
    Voulez-vous continuer?(o/n):
    o
    Entrez un entier (Attention aucun test d'erreur impléménté!!):2
    Voulez-vous continuer?(o/n):
    o
    Entrez un entier (Attention aucun test d'erreur impléménté!!):3
    Voulez-vous continuer?(o/n):
    n
    Voulez-vous dépiler le conteneur?(o/n):o
    Message de B:
    Taille du conteneur: 3
    Je dépile mon conteneur: 10x604ca8
    Message de B:
    Taille du conteneur: 2
    Je dépile mon conteneur: 20x604ca8
    Message de B:
    Taille du conteneur: 1
    Je dépile mon conteneur: 30x604ca8

    Press ENTER to continue.
    Beaucoup de code pour pas grand chose, si ce n'est ce petit lièvre...
    Quelle explication se cache derrière ces valeurs?

  2. #2
    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
    Citation Envoyé par Krishna Voir le message
    Beaucoup de code pour pas grand chose, si ce n'est ce petit lièvre...
    Quelle explication se cache derrière ces valeurs?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::cout<<"\nJe dépile mon conteneur:\t"<<m_qint.front()<<std::cout<<std::endl;

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    eu...merci

  4. #4
    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
    Salut,

    Au passage, et bien que cela n'ai pas énormément de rapport avec ta question...

    Si la classe A prend la responsabilité de demander l'allocation dynamique de la mémoire pour contenir un B, il semblerait cohérent qu'elle prenne aussi la responsabilité... d'en demander la libération

    En effet, il ne faut pas oublier qu'à chaque new (ou new[]) doit correspondre ... un delete (ou delete[])

    Si tu n'invoque pas delete sur le membre m_pb de ta classe A, au plus tard lors de la destruction de A, tu te dirige droit vers une fuite mémoire, ce qui, à terme, risque de mener à des catastrophes...

    C'est pourquoi, dans le code que tu présentes, il faudrait modifier le destructeur de ta classe A en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A::~A()
    {
        delete m_pb;
        /* d'aucuns estiment que c'est inutile ;) */
        m_pb=NULL;
    }
    De même, pourquoi as tu déclaré le destructeur de A comme étant virtuel

    Comme il n'y a pas d'héritage déclaré avec comme base la classe A, c'est totalement inutile
    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

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

Discussions similaires

  1. Petit soucis avec Thread::Queue et une classe
    Par vodevil dans le forum Web
    Réponses: 16
    Dernier message: 09/06/2006, 21h41
  2. Réponses: 2
    Dernier message: 17/05/2006, 11h43
  3. Problem avec std::vector
    Par boiteweb dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/04/2006, 12h56
  4. Problème avec std::Vector
    Par mister3957 dans le forum SL & STL
    Réponses: 8
    Dernier message: 16/02/2006, 10h18
  5. Recherche "étoilée" avec std::set
    Par guejo dans le forum MFC
    Réponses: 2
    Dernier message: 06/05/2004, 13h28

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