2012-11-15 2 views
1

J'ai une classe ClientWindow. J'ai créé plusieurs instances et ajouté leurs pointeurs à une liste. Si j'essaie de montrer l'une des fenêtres, cependant, je reçois "Erreur de segmentation (core dumped)" Je garde la liste des fenêtres dans une classe appelée contrôleur.Qt Erreur de segmentation d'erreur lors de la tentative d'affichage de la fenêtre

Voici mon fichier d'en-tête du contrôleur:

#ifndef CONTROLLER_H 
#define CONTROLLER_H 

#include "clientwindow.h" 

class Controller 
{ 
public: 
    Controller(); 
    void createClients(int num); 
    void showWindows(); 

private: 
    QList<ClientWindow*> clWList; 
    int size; 
}; 

#endif // CONTROLLER_H 

c'est le fichier cpp:

#include "controller.h" 

Controller::Controller() 
{ 
} 

void Controller::createClients(int num) 
{ 
    size = num; 
    for(int i = 0; i < size; i++) 
    { 
     ClientWindow cw; 
     clWList.append(&cw); 
    } 
} 

void Controller::showWindows() 
{ 
    for(int i = 0; i < size; i++) 
    { 
     ClientWindow* cw = clWList.at(0); 
     cw->show(); 
    } 
} 

c'est mon principal:

#include <QtGui/QApplication> 
#include "clientwindow.h" 
#include "controller.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    // ClientWindow w; 
    // w.show(); 

    QString temp = argv[1]; 
    bool ok; 
    int tempI = temp.toInt(&ok, 10); 
    Controller c; 
    c.createClients(tempI); 
    c.showWindows(); 



    return a.exec(); 
} 

Répondre

2

C'est là ça ne va pas:

for(int i = 0; i < size; i++) 
{ 
    ClientWindow cw; 
    clWList.append(&cw); 
} 

Une variable locale cw est créée sur la pile à chaque itération. Il est désaffecté à la fin de chaque itération. Ce qui signifie que les données ont disparu. Donc, vous finissez par stocker des pointeurs pointant vers indésirable.

L'appel d'une fonction membre d'un courrier indésirable entraîne généralement un blocage. :) Faites-le à la place:

for(int i = 0; i < size; i++) 
{ 
    ClientWindow * cw = new ClientWindow(); 
    clWList.append(cw); 
} 

Vous devrez parcourir la liste et supprimer les objets une fois que vous avez terminé avec eux.

+0

Cela a fonctionné! Merci. – Amre

Questions connexes