1. 程式人生 > >關於QT在開啟子視窗時程式崩潰的其中一個原因分析

關於QT在開啟子視窗時程式崩潰的其中一個原因分析

其實這個問題當時是糾結了我很長的一段時間,這段時間裡面,我一直在網上面找相關的資料但是卻沒有有用的資訊。

但是在後面的一個機緣巧合之下,我通過函式執行順序來Debug,慢慢的發現問題出現在什麼地方了。現在來總結一下這個問題吧。

其實我現在的經驗覺得,對於QT裡面(由於QT是基於C++的),不少的程式崩潰都可以往指標上面去靠攏。因為指標的指向錯誤或者指向了錯誤地區導致記憶體訪問出錯進而導致程式崩潰是經常出現的一種問題。現在我來說說我的問題。

我的主介面上面有一個按鈕,按鈕新增的槽就是在點選按鈕以後,新建立一個物件,並且把這個物件給show出來。

但是這個時候經常就是會出現Program Unexpected Stop/Crash

我就很痛苦,通過程式執行順序邏輯來檢視裡面的問題,一開始感覺沒有什麼問題,但是後面就開始發現不對勁了。

void MainWindow::enter_eigth_number()
{
    numWin = new enumber();
    numWin->show();
}

看這個程式碼,就是開啟子視窗的槽函式,恩,現在還很好;

註釋了numWin->show()發現崩潰現象仍然存在,定位在numWin產生物件時發生錯誤;

去看看numWin的函式

enumber::enumber(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::enumber)
{
    ui->setupUi(this);
    setWindowTitle("小小八數碼");
    init_pic();
    connect(ui->close,SIGNAL(clicked(bool)),this,SLOT(close()));
    connect(ui->start,SIGNAL(clicked(bool)),this,SLOT(start()));
    connect(ui->load,SIGNAL(clicked(bool)),this,SLOT(loadp()));
}

怎麼感覺還很好呢??

再看看init_pic();

void enumber::init_pic()
{
    QImage *ice;
    ice= new QImage(":/image/0");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/1");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/2");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/3");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/4");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/5");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/6");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/7");
    imgstack.push_back(*ice);
    ice= new QImage(":/image/8");
    imgstack.push_back(*ice);

    loadp(open[0]);
}

恩,還沒有什麼問題啊?TAT


看看loadp()

void enumber::loadp(node *n)
{
    int width = ui->num00->width();
    int height = ui->num00->height();
    ui->num00->setPixmap(QPixmap::fromImage(imgstack[n->disk[0][0]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num01->setPixmap(QPixmap::fromImage(imgstack[n->disk[0][1]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num02->setPixmap(QPixmap::fromImage(imgstack[n->disk[0][2]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num10->setPixmap(QPixmap::fromImage(imgstack[n->disk[1][0]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num11->setPixmap(QPixmap::fromImage(imgstack[n->disk[1][1]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num12->setPixmap(QPixmap::fromImage(imgstack[n->disk[1][2]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num20->setPixmap(QPixmap::fromImage(imgstack[n->disk[2][0]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num21->setPixmap(QPixmap::fromImage(imgstack[n->disk[2][1]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
    ui->num22->setPixmap(QPixmap::fromImage(imgstack[n->disk[2][2]]).scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation));
}

哦豁!!!!!

你們發現了沒有??

一開始的構造裡面,呼叫了init_pic();

但是在init_pic()裡面呼叫了loadp;

呼叫黨的loadp()裡面還呼叫了imstack這個沒有初始化的東西,在當初寫的時候在想到了後續初始化的情況,傻乎乎的忘記了在初始化時指標為空,可能出現越界訪問的情況!!!

在構造中吧init_pic註釋,OK!