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

时间:2012-11-15 20:47:25

标签: qt pointers qt-creator qmainwindow

我有一个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();
}

1 个答案:

答案 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);
}

完成后,您必须浏览列表并删除对象。