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

Posted

技术标签:

【中文标题】尝试显示窗口时出现 Qt 错误分段错误【英文标题】:Qt Error segmentation fault when trying to show window 【发布时间】: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();

【问题讨论】:

【参考方案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);

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

【讨论】:

以上是关于尝试显示窗口时出现 Qt 错误分段错误的主要内容,如果未能解决你的问题,请参考以下文章

呈现窗口时出现 Gtkmm 分段错误

尝试锁定共享内存互斥体时出现分段错误

将结构插入地图时出现分段错误

获取 QString 时出现分段错误

删除时出现分段错误

仅在不使用调试器时出现段错误