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 :

[c++] Plantage à la fermeture du programme


Sujet :

C++

  1. #1
    Membre chevronné Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut [c++] Plantage à la fermeture du programme
    Bonjour,

    Je développe un petit projet pour mes études mais je tombe sur un problème à chaque fois que je ferme mon programme...ce n'est pas trop genant me direz vous mais de 1 ca fait pas propre et de 2 ca doit vouloir dire que je n'ai pas compris une subtilité du C++ et ca me derange beaucoup.

    Mon programme est développez sous qt mais à prioris ce n'est pas ça qui doit faire planter...enfin j'espère que qt n'est pas incompatible avec ce que je veux faire...

    Voila mon code: Othellier.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
     
     
    #ifndef H_OTHELLIER
    #define H_OTHELLIER
     
    #include <qlabel.h>
    #include <QWidget.h>
    #include <QGridLayout.h>
     
     
    class Case : public QWidget {
        public:
            Case( QWidget *parent = NULL );
    };
     
    class Othellier : public QLabel {
        public:
            Othellier( int sizeOthellier,  QWidget *parent = NULL );
            ~Othellier();
        private:
            Case ** tiles;
            int size;
    };
     
    #endif
    Othellier.cpp
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include "othellier.h"
     
    Othellier::Othellier( int sizeOthellier, QWidget *parent ){
        int i,j;
        QGridLayout *layout = new QGridLayout;
     
        setPalette(QPalette(QColor(0, 0, 0)));
        setAutoFillBackground(true);
        setFixedSize(440,440);
     
        tiles = new Case* [sizeOthellier];
     
        for( i=0;i<sizeOthellier;i++){
            tiles[i] = new Case [sizeOthellier];
            for( j=0;j<sizeOthellier;j++){
                Case *temp = &tiles[i][j];
                layout->addWidget(temp,i,j);
            }
        }
     
        this->setLayout(layout);
    }
     
    Othellier::~Othellier(){
        int i;
        for( i=0;i<size;i++){
            delete [] tiles[i];
        }
        delete [] tiles;
    }
     
    Case::Case( QWidget *parent ) : QWidget(parent){
        setPalette(QPalette(QColor(10, 173, 29)));
        setAutoFillBackground(true);
        setFixedSize(50,50);
    }
    Main.cpp

    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 <qstring.h>
    #include <qapplication.h>
    #include <qpushbutton.h>
    #include <qmenubar.h>
    #include <qmenu.h>
    #include "othellier.h"
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
     
        Othellier myWindow(8);
        myWindow.setGeometry(100, 100,700, 500);
     
        myWindow.show();
     
        return app.exec();
    }
    J'imagine que ca vient du faite de la matrice allouer dynamiquement mais malgrès le delete ca marche toujours pas...

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Othellier::~Othellier(){ 
        int i; 
        for( i=0;i<size;i++){ 
            delete [] tiles[i];
    .....
    qui a mis une valeur dans size ? je n'ai pas vu (sauf erreur) l'initialisation de size dans le constructeur

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    L'erreur vient du fait que la mémoire des cases est libérée deux fois.
    Une fois par ton destructeur, et une fois par Qt.

    Un principe de base de Qt est que tous les widgets sont automatiquement détruits par leur conteneur quand celui-ci est lui-même détruit.

  4. #4
    Membre chevronné Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Par défaut
    C'est ce que je me disait aussi loufoque et c'est bien pour ça que j'avais essayé sans... Et comme ca ne marchait pas je me suis dit on va faire le destructeur. Et la j'avais oublié l'affectation du size...

    Mais au final mon probleme c'est réglé quand j'ai fais le moc associé a othellier.h ... a prioris il en avait besoin. Ou alors j'ai fait autre chose entre temps mais je vois pas quoi. Toujours est il que maintenant ca marche et je suis trop content

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En général il suffit de refaire le moc, puis de recompiler tous les fichiers et cela marche...

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est pas parce que ça marche qu'il n'y a pas de fuites mémoire.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/11/2006, 23h39
  2. Plantage étrange d'un programme
    Par punx120 dans le forum Visual C++
    Réponses: 4
    Dernier message: 04/08/2006, 22h52
  3. Fermeture de programme
    Par janego dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/07/2006, 19h06
  4. Fermeture du programme
    Par oasis_5 dans le forum Général Python
    Réponses: 11
    Dernier message: 08/03/2006, 11h28
  5. Réponses: 7
    Dernier message: 24/01/2005, 11h36

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