2012-11-15 193 views
1

我有一个ClientWindow类。我创建了它的几个实例,并将它们的指针附加到列表中。如果我试图显示任何窗口,但是,我得到“分段错误(核心转储)”我保持窗口列表称为控制器类。Qt尝试显示窗口时出现错误分段错误

这里是我的控制器头文件:

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

回答

2

这是它出错:

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

你必须通过列表并删除对象完成后。

+0

工作!谢谢。 – Amre

相关问题