[résolu][c++] Plantage à la fermeture du programme

Plantage à la fermeture du programme [résolu][c++] - C++ - Programmation

Marsh Posté le 19-02-2006 à 15:33:32    

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 :
  1. #ifndef H_OTHELLIER
  2. #define H_OTHELLIER
  3. #include <qlabel.h>
  4. #include <QWidget.h>
  5. #include <QGridLayout.h>
  6. class Case : public QWidget {
  7.     public:
  8.         Case( QWidget *parent = NULL );
  9. };
  10. class Othellier : public QLabel {
  11.     public:
  12.         Othellier( int sizeOthellier,  QWidget *parent = NULL );
  13.         ~Othellier();
  14.     private:
  15.         Case ** tiles;
  16.         int size;
  17. };
  18. #endif


 
Othellier.cpp

Code :
  1. #include "othellier.h"
  2. Othellier::Othellier( int sizeOthellier, QWidget *parent ){
  3.     int i,j;
  4.     QGridLayout *layout = new QGridLayout;
  5.     setPalette(QPalette(QColor(0, 0, 0)));
  6.     setAutoFillBackground(true);
  7.     setFixedSize(440,440);
  8.     tiles = new Case* [sizeOthellier];
  9.     for( i=0;i<sizeOthellier;i++){
  10.         tiles[i] = new Case [sizeOthellier];
  11.         for( j=0;j<sizeOthellier;j++){
  12.             Case *temp = &tiles[i][j];
  13.             layout->addWidget(temp,i,j);
  14.         }
  15.     }
  16.     this->setLayout(layout);
  17. }
  18. Othellier::~Othellier(){
  19.     int i;
  20.     for( i=0;i<size;i++){
  21.         delete [] tiles[i];
  22.     }
  23.     delete [] tiles;
  24. }
  25. Case::Case( QWidget *parent ) : QWidget(parent){
  26.     setPalette(QPalette(QColor(10, 173, 29)));
  27.     setAutoFillBackground(true);
  28.     setFixedSize(50,50);
  29. }


 
Main.cpp
 

Code :
  1. #include <qstring.h>
  2. #include <qapplication.h>
  3. #include <qpushbutton.h>
  4. #include <qmenubar.h>
  5. #include <qmenu.h>
  6. #include "othellier.h"
  7. int main(int argc, char *argv[])
  8. {
  9.     QApplication app(argc, argv);
  10.     Othellier myWindow(8);
  11.     myWindow.setGeometry(100, 100,700, 500);
  12.     myWindow.show();
  13.     return app.exec();
  14. }


 
J'imagine que ca vient du faite de la matrice allouer dynamiquement mais malgrès le delete ca marche toujours pas...


Message édité par Asmodean le 19-02-2006 à 20:38:20
Reply

Marsh Posté le 19-02-2006 à 15:33:32   

Reply

Marsh Posté le 19-02-2006 à 16:20:27    

J'espère que quelqu'un te répondra ici, évite de poster sur 50 forums différents. Merci.
(Je ne connais pas qt, je ne me suis pas penché sur ton problème.)

Reply

Marsh Posté le 19-02-2006 à 17:29:42    

utlise un std::vector

Reply

Marsh Posté le 19-02-2006 à 17:32:33    

Salut,
Je crois que dans ton constructeur tu as oublié de faire:
size = sizeOthellier;
 
Du coup dans le destructeur, size est indefini et ca fait une erreur.

Reply

Marsh Posté le 19-02-2006 à 17:41:46    

nan. qu'il utlise std::vector
 
sinon ya  qu'a compter les new/delete, toujours par 2 ils vont.

Reply

Marsh Posté le 19-02-2006 à 19:19:37    

Oui, il y a sans doute un déréférencement qq part après destruction d'un objet, donc un pb d'ordre de destruction.

Reply

Marsh Posté le 19-02-2006 à 20:37:42    

Bon mon problème a été résolu...merci à vous pour toute vos idée. En effet y'avait l'erreur bête de pas affecter mon size. Mais le plantage a disparu dès l'instant où j'ai crée mon moc de QT. Il faut croire qu'il en avait besoin quoique ca m'étonne un peu. Donc j'ai pu enlever le constructeur pusique QT s'occupe de faire toute les libérations de mémoire comme je le pensait au début avant de rajouter mon destructeur.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed