我有一个ClientWindow类。我创建了它的几个实例,并将它们的指针附加到列表中。如果我试图显示任何窗口,但我得到“分段错误(核心转储)”我将窗口列表保存在一个名为控制器的类中。
这是我的控制器头文件:
#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
这是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();
}
}
这是我的主要内容:
#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();
}
答案 0 :(得分:3)
这是出错的地方:
for(int i = 0; i < size; i++)
{
ClientWindow cw;
clWList.append(&cw);
}
在每次迭代中在堆栈上创建局部变量cw。它在每次迭代结束时解除分配。意味着数据消失了。所以你最终存储指向垃圾的指针。
调用垃圾的成员函数通常会导致崩溃。 :)改为:
for(int i = 0; i < size; i++)
{
ClientWindow * cw = new ClientWindow();
clWList.append(cw);
}
完成后,您必须浏览列表并删除对象。