1

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

这是我的控制器头文件:

#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();
}
4

1 回答 1

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

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

于 2012-11-15T20:55:41.603 回答