尝试显示窗口时出现Qt错误分段错误

尝试显示窗口时出现Qt错误分段错误,qt,pointers,qt-creator,qmainwindow,Qt,Pointers,Qt Creator,Qmainwindow,我有一个类客户端窗口。我已经创建了几个实例,并将它们的指针附加到列表中。但是,如果我尝试显示任何窗口,我会得到“分段错误(内核转储)”,我会将窗口列表保存在名为controller的类中 这是我的控制器头文件: #ifndef CONTROLLER_H #define CONTROLLER_H #include "clientwindow.h" class Controller { public: Controller(); void createClients(int nu

我有一个类客户端窗口。我已经创建了几个实例,并将它们的指针附加到列表中。但是,如果我尝试显示任何窗口,我会得到“分段错误(内核转储)”,我会将窗口列表保存在名为controller的类中

这是我的控制器头文件:

#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
\ifndef控制器
#定义控制器
#包括“clientwindow.h”
类控制器
{
公众:
控制器();
void createClients(int num);
void showWindows();
私人:
QList-clWList;
整数大小;
};
#endif//CONTROLLER\u H
这是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();
    }
}
#包括“controller.h”
控制器::控制器()
{
}
无效控制器::createClients(int num)
{
大小=个数;
对于(int i=0;ishow();
}
}
这是我的主要观点:

#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();
}
#包括
#包括“clientwindow.h”
#包括“controller.h”
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
//客户端窗口w;
//w.show();
QString temp=argv[1];
布尔ok;
int tempI=温度toInt(&ok,10);
控制器c;
c、 createClients(tempI);
c、 showWindows();
返回a.exec();
}

这就是问题所在:

for(int i = 0; i < size; i++)
{
    ClientWindow cw;
    clWList.append(&cw);
}
for(int i=0;i
在每次迭代中,在堆栈上创建一个局部变量cw。它在每次迭代结束时解除分配。意味着数据不见了。因此,您最终存储指向垃圾的指针

调用垃圾邮件的成员函数通常会导致崩溃。:)改为这样做:

for(int i = 0; i < size; i++)
{
    ClientWindow * cw = new ClientWindow();
    clWList.append(cw);
}
for(int i=0;i
处理完这些对象后,您必须浏览列表并删除它们