【问题标题】:Qt Error segmentation fault when trying to show window尝试显示窗口时出现 Qt 错误分段错误
【发布时间】:2012-11-15 20:47:24
【问题描述】:

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

【问题讨论】:

    标签: qt pointers qt-creator qmainwindow


    【解决方案1】:

    这是出错的地方:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 1970-01-01
      • 2015-08-27
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 2016-07-25
      相关资源
      最近更新 更多