2017-03-13 85 views
0

我一直在研究一個具有多個遊戲的項目。當用戶選擇其中一個遊戲時,我遇到錯誤,應用程序崩潰。這隻發生在配置文件模式。
我得到的錯誤是從Microsoft Visual C++運行時庫:QT項目在配置文件中崩潰,使用發佈版和調試器運行

該應用程序了有要求運行在一個不尋常的方式 終止...

從網上閱讀看來我做不適當的記憶管理,我似乎無法找出問題所在。這裏是我的C++源文件:

#include "sticks.h" 
#include "ui_sticks.h" 
Sticks::Sticks(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::Sticks) 
{ 
    ui->setupUi(this); 
} 

Sticks::~Sticks() 
{ 
    delete ui; 
} 

int Sticks::selectUserChoice(int choice){ 
    ui->pushButton_select1->setEnabled(false); 
    ui->pushButton_select2->setEnabled(false); 
    ui->pushButton_select3->setEnabled(false); 
    numsticks = numsticks - choice; 
    //game_msg = "You grabbed " + QString::number(choice) + " sticks. There are " + QString::number(numsticks) + " sticks remaining"; 
    //setMessage(game_msg); 
    computerChoice = getComputerChoice(numsticks); 
    numsticks = numsticks - computerChoice; 
    if (numsticks == 1) 
     ui->pushButton_select1->setEnabled(true); 
    if (numsticks == 2){ 
     ui->pushButton_select1->setEnabled(true); 
     ui->pushButton_select2->setEnabled(true); 
    } 
    else{ 
     ui->pushButton_select1->setEnabled(true); 
     ui->pushButton_select2->setEnabled(true); 
     ui->pushButton_select3->setEnabled(true); 
    } 
} 

    int Sticks::getComputerChoice(int current_sticks){ 
     /*Get a pseudo-random integer between 1 and 3 (inclusive)*/ 
     int choice = rand() % 3 + 1; 

     if (current_sticks >=2 && current_sticks <=4){ 
      choice = current_sticks - 1; 
    } 
    else if (current_sticks == 1){ 
     return current_sticks; 
    } 
    return choice; 
} 

void Sticks::on_pushButton_select1_clicked() 
{ 
selectUserChoice(1); 
} 

void Sticks::on_pushButton_select2_clicked() 
{ 
    selectUserChoice(2); 
} 

void Sticks::on_pushButton_select3_clicked() 
{ 
selectUserChoice(3); 
} 

void Sticks::on_pushButton_select_num_sticks_clicked() 
{ 
    numsticks = ui->lineEdit_numsticks->text().toInt(); 
    if (numsticks < 10 || numsticks > 100) //Check that numsticks is 10-100 
     return; 
    std::ostringstream ss; 
    ss << "There are " << numsticks << " sticks remaining"; 
    std::string str = ss.str(); 
    QString qstr = QString::fromStdString(str); 
    ui->label_current_sticks->setText(qstr); 
    //ui->horizontalLayout->removeWidget(ui->pushButton_select_num_sticks); 
    delete ui->pushButton_select_num_sticks; 
    delete ui->lineEdit_numsticks; 
    ui->pushButton_select1->setEnabled(true); 
    ui->pushButton_select2->setEnabled(true); 
    ui->pushButton_select3->setEnabled(true); 
    ui->label_grab->setEnabled(true); 
} 

void Sticks::setMessage(QString msg){ 
    /* 
    prev_msg3 = ui->label_msg3->text(); 
    prev_msg2 = ui->label_msg2->text(); 
    prev_msg1 = ui->label_msg1->text(); 
    ui->label_msg4->setText(prev_msg3); 
    ui->label_msg3->setText(prev_msg2); 
    ui->label_msg2->setText(prev_msg1); 
    ui->label_msg1->setText(msg); 
    */ 
} 
+0

請編輯您的問題以提供[mcve]。 –

回答

1

你的問題可能是在這兩條線:

delete ui->pushButton_select_num_sticks; 
delete ui->lineEdit_numsticks; 

你刪除那些(我想)的東西你是不是動態分配。

而且要小心對待這個析構函數:

Sticks::~Sticks() 
{ 
    delete ui; 
} 

如果複製Sticks對象將複製指針ui太多,所以你要刪除同一地址多次。

+0

這似乎是,謝謝!現在我只需要弄清楚如何正確地從UI形式中刪除對象。 –

相關問題