1

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();
}
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 に答える