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 :

new et delete facetieux


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut new et delete facetieux
    après avoir lu le cours de C++ du site j'ai voulu modifier mon code de façon à libérer la mémoire alouée dynamiquement.
    J'ai donc créé deux tableaux de 32 de type CCaseblance et CCasenoire de manière à pouvoir les "deleté" dans mon destructeur.
    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
    #ifndef CECHIQUIER_H
    #define CECHIQUIER_H
    
    #include <gtkmm.h>
    #include <iostream>
    
    #include "CCaseblanche.h"
    #include "CCasenoire.h"
    
    class CEchiquier : public Gtk::Table
    {
        public:
        //constructeur et destructeur
        CEchiquier();
        virtual ~CEchiquier();
        void affiche();
        protected:
        CCasenoire *m_ptabnoire;
        CCaseblanche *m_ptabblanche;
    };
    
    #endif //CECHIQUIER_H
    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
    24
    25
    26
    #include "CEchiquier.h"
    
    CEchiquier::CEchiquier():Table(10,10,true),m_ptabnoire(new CCasenoire[32]),m_ptabblanche(new CCaseblanche[32])
    {
        //int index=-1;
        for(int j=1;j<9;j+=2){
            for(int i=1;i<9;i+=2){
                attach(*new CCaseblanche,i,i+1,j,j+1);-->attach(m_ptabblanche[index++],i,i+1,j,j+1);
                attach(*new CCasenoire,i+1,i+2,j,j+1);-->attach(m_ptabnoire[index++],i,i+1,j,j+1);
            }
        }
        for(int j=2;j<9;j+=2){
            for(int i=1;i<9;i+=2){
                attach(*new CCasenoire,i,i+1,j,j+1);-->attach(m_ptabnoire[index++],i,i+1,j,j+1);
                attach(*new CCaseblanche,i+1,i+2,j,j+1);-->attach(m_ptabblanche[index++],i,i+1,j,j+1);
            }
        }
        std::cout<<"m_ptabblanche[1]: "<< m_ptabblanche[1]<<std::endl;
        affiche();
        show_all_children();
    }
    CEchiquier::~CEchiquier()
    {
        delete m_ptabnoire;
        delete m_ptabblanche;
    }
    Si je modifie mon code avec ce qui est rouge, la compilation va très bien mais quand je lance le prog, Bug buddy prend la main et génère un fichier erreur:
    [?1034hUsing host libthread_db library "/lib64/libthread_db.so.1".
    0x0000003518c9a835 in waitpid () from /lib64/libc.so.6
    #0 0x0000003518c9a835 in waitpid () from /lib64/libc.so.6
    #1 0x00000035d9e5e4c0 in g_spawn_sync () from /lib64/libglib-2.0.so.0
    #2 0x00000035d9e5e7b8 in g_spawn_command_line_sync ()
    from /lib64/libglib-2.0.so.0
    #3 0x00002aaaaf7a23cd in Gtk::Widget::show_all_vfunc ()
    from /usr/lib64/gtk-2.0/modules/libgnomebreakpad.so
    #4 <signal handler called>
    #5 0x00000037572e2b33 in Gtk::Table::attach ()
    from /usr/lib64/libgtkmm-2.4.so.1
    #6 0x0000000000408a13 in CEchiquier (this=0x6b8380)
    at /home/...CEchiquier.cc:9
    #7 0x000000000040a3cb in CGnomeapp (this=0x7fff610fb4d0)
    at /home/.../CGnomeapp.cc:27
    #8 0x000000000040b7e9 in main (argc=1, argv=0x7fff610fb878)
    at /home/.../main.cc:13
    The program is running. Quit anyway (and detach it)? (y or n) [answered Y; input not from terminal]
    Quequ'un aurait-il une idée?

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    en fait tu post-incrémentes index, donc la première fois tu vas accéder à m_ptabblanche[-1] et non m_ptabblache[0].

    En plus tu incrémentes deux fois index dans tes boucles.

    Selon moi (mais je me trompe peut-être), ce que tu voudrais faire s'apparenterait plutôt à ç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
    CEchiquier::CEchiquier():Table(10,10,true),m_ptabnoire(new CCasenoire[32]),m_ptabblanche(new CCaseblanche[32])
    {
        //int index=0;
        for(int j=1;j<9;j+=2){
            for(int i=1;i<9;i+=2, index++){
                attach(*new CCaseblanche,i,i+1,j,j+1);-->attach(m_ptabblanche[index],i,i+1,j,j+1);
                attach(*new CCasenoire,i+1,i+2,j,j+1);-->attach(m_ptabnoire[index],i,i+1,j,j+1);
            }
        }
        for(int j=2;j<9;j+=2){
            for(int i=1;i<9;i+=2, index++){
                attach(*new CCasenoire,i,i+1,j,j+1);-->attach(m_ptabnoire[index],i,i+1,j,j+1);
                attach(*new CCaseblanche,i+1,i+2,j,j+1);-->attach(m_ptabblanche[index],i,i+1,j,j+1);
            }
        }
        std::cout<<"m_ptabblanche[1]: "<< m_ptabblanche[1]<<std::endl;
        affiche();
        show_all_children();
    }

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    delete vs. delete[]
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  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,

    En plus, si on y réfléchit bien un échiquier n'a jamais que 64 cases, dans tous les pays du monde...

    On peut donc être sur, étant donné qu'il y a parité entre cases noires et cases blanches, qu'il n'y aura jamais que... 32 case de chaque couleur... Ou alors, c'est qu'il s'agit d'un damier ou d'un jeu de morpion ou... va savoir de quoi il peut s'agir

    Dés lors, il ne me semble pas opportun de vouloir travailler sur un tableau dynamique pour gérer les cases.

    De plus la couleur est très facilement évaluable sur base de la position horizontale et de la position verticale sur l'échiquier, étant donné que la case se trouvant en A1 sera toujours de la même couleur (noire en l'ocurence)

    Au final, ce qui te reste à gérer, c'est:
    • Le fait qu'une case donnée soit libre ou non
    • La couleur et le type de la piece qui se trouve sur une case donnée indiquée comme utilisée


    Seul le fou est susceptible de s'intéresser à la couleur des cases, étant donné qu'il ne peut voyager qu'en diagonale
    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. #5
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut

    -D'abord le coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=1;i<9;i+=2, index++)
    -Une syntaxe que je ne connaissais pas. De même la "post-incrémentation" de la variable.
    -Ensuite, puisque le nombre de case est fixe, je vais éviter l'allocation dynamique en déclarant "à la main" tout ce dont j'ai besoin.
    -Quand au lien "Raymond Chen" je me suis promis de le lire attentivement, ça semble très instructif.

    -Reste une question:
    Dans mes vieux souvenirs de vc++6, il me semble qu'il existait des outils de détection de fuite de mémoire. Quel est le pendant linuxien?

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    je crois, d'après ce qu'on m'a dit, que valgrind à lui seul valait le passage à linux

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Merci!

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

Discussions similaires

  1. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  2. Surdéfinition de new et delete
    Par couet dans le forum C++
    Réponses: 3
    Dernier message: 09/02/2007, 15h19
  3. surdefinition operateur new et delete
    Par johjoh dans le forum C++
    Réponses: 23
    Dernier message: 08/12/2006, 10h10
  4. intrigue sur la surcharge du new et delete
    Par swirtel dans le forum C++
    Réponses: 12
    Dernier message: 07/09/2006, 15h23
  5. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29

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