调用方法后应用程序崩溃

时间:2016-07-24 18:45:13

标签: c++ qt oop pointers memory

我想从我QString类中名为DB的类中存在的函数返回MainWindow值,但它总是会崩溃应用程序。

db.h

#ifndef DB_H
#define DB_H

#include <QMainWindow>
#include <QtSQl>
#include <QSqlQuery>
#include <QSqlError>
#include <QObject>
#include <QDialog>

class DB : public QMainWindow
{
    Q_OBJECT
public:
    explicit DB(QWidget *parent = 0);

    QString getDriver() const;
    void setDriver(const QString &value);

private:
    QString Driver="test";

signals:

public slots:
};

#endif // DB_H

这是 db.cpp

#include "db.h"

DB::DB(QWidget *parent) : QMainWindow(parent)
{

}

QString DB::getDriver() const
{
    return Driver;
}


void DB::setDriver(const QString &value)
{
    Driver = value;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QFileInfo>
#include <QDialog>
#include <QObject>
#include "Db.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    DB *conn;

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

mainwindow.cpp

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

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

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

void MainWindow::on_pushButton_clicked()
{
    QString driverfromdb = conn->getDriver();
    qDebug() << driverfromdb;
}

当我点击按钮时会发生这种情况:image

2 个答案:

答案 0 :(得分:0)

您正在DB

中声明指向MainWindow类的指针
DB *conn;

但你永远不会初始化它。目前它没有指向任何东西,所以如果你试图访问它:

QString driverfromdb = conn->getDriver(); // boom, conn is somewhere in the void

解决方案很简单,您需要在使用之前创建一个DB对象,例如:

void MainWindow::on_pushButton_clicked()
{
    conn = new DB();
    QString driverfromdb = conn->getDriver();
    qDebug() << driverfromdb;
}

或者只是让conn成为典型变量,而不是指针:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    DB conn; // conn is created after creating MainWindow object

这样你就不必初始化任何东西,你就可以避免崩溃。

答案 1 :(得分:0)

或:

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


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