QT:内存问题。无法访问课程

时间:2014-03-21 19:25:46

标签: qt

如果Qt像常规C ++一样工作,为什么我不能使用方法访问我的类对象?例如,我在MainWindow.h类的私有字段中声明了一个指向foo对象的指针 我有一个名为setFoo()的方法作为实例化foo对象的类MainWindow的函数。当按下按钮时,会从事件中调用setFoo()函数,我将其命名为on_button_1_clicked。我可以在这个函数中访问我的foo类。但是,当我调用on_button_2_clicked时,foo类无法访问。

void MainWindow::on_pushButton_1_clicked() {
    this->setFoo();
    qDebug() << QString::fromStdString(this->confirmName());
} 

上面的代码将打印出我的一个类数据元素。

void MainWindow::on_pushButton_2_click() {
    qDebug() << QString::fromStdString(this->confirmName());
}

上面的代码不会打印出来。

我是QT5的新手,任何帮助都会很棒,因为我已经对这个问题进行了一段时间的讨论,也许这是一般来说接近QT的错误方法。

完整代码:     #include

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void setPlayer(int);
    std::string getName();
    std::string confirmName();

~MainWindow();

private slots:
   void on_pushButton_clicked();

   void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    Board * board;

上面的代码是标准的MainWindow,但包含了类板

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "Board.h"
#include <string>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_pushButton_clicked()
{
this->setPlayer(2);
qDebug() << QString::fromStdString(this->confirmName());
}

void MainWindow::on_pushButton_2_clicked()
{
    qDebug() << QString::fromStdString(this->confirmName());
}

void MainWindow::setPlayer( int num ) {
    board= new Board( num );
    std::string name_string[2] = {"INPUT1","INPUT2"};
    board->addNames( name_string );
    qDebug() << QString::fromStdString( getName() ) << endl;
}

std::string MainWindow::confirmName() {
    qDebug() << "Confirming Name" << endl;
    this->board->test();
    Player ** tmp_player = this->board->getPlayer();
    std::string tmp_string = tmp_player[0]->getName();
    return tmp_string;
}

输出:

/*clicked button1*/
“INPUT1”
Confirming Name
“INPUT1” 
/*clicked button2*/
Confirming Name
“”

1 个答案:

答案 0 :(得分:0)

说Qt与其他C ++程序的工作方式不同就像是说地球与其他行星的行为不同,因为其他行星没有人类。

就您的代码而言,您使用的唯一Qt特定功能是按钮和主窗口之间的信号槽连接。从您的输出 - 您在单击按钮2时输出“确认名称” - 这似乎正常工作。

因此,您的问题是MainWindow::confirmName()本身的代码。

1   qDebug() << "Confirming Name" << endl;
2   this->board->test();
3   Player ** tmp_player = this->board->getPlayer();
4   std::string tmp_string = tmp_player[0]->getName();
5   return tmp_string;

正如输出所示,第1行正在运行,因此问题还在于函数。 您尚未提供Board类或Player类的代码,因此我们任何人都无法确定问题的确切位置。

供您参考: 您的setPlayer功能中存在内存泄漏。

void MainWindow::setPlayer( int num ) {
    board= new Board( num );
    std::string name_string[2] = {"INPUT1","INPUT2"};
    board->addNames( name_string );
    qDebug() << QString::fromStdString( getName() ) << endl;
}

每次调用此函数时,都会分配一个新的Board对象,前一个对象会丢失。如果您调用该函数四次,则将分配四个对象,但board指针仅引用最后一个对象。剩下的就永远丢失了。

我建议进行以下更改:

  1. 在构造函数中添加

    board = 0;
    
  2. 将您的setPlayer功能更改为以下内容:

    if (board != 0) {
        delete board;
    }
    
  3. 您的Board班级正在从Player **函数返回getPlayer()。管理指针本身就是一个挑战。管理指针指针更加困难。我建议改用QList<Player*>。 Qt有许多非常有用的容器类,使用它们。