2016-05-04 18 views
0

行列計算機で作業していて、本当に厄介な問題に遭遇しました.3時間修正しようとしていましたが、改善するのではなく悪化しています。多分あなたは助けることができるでしょう。あなたは私が私のメインウィンドウでQMapを持って見ることができるようにQt - マップとメモリリークに要素を追加する

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QPushButton> 
#include <QGridLayout> 
#include <QLabel> 
#include "addmatrix.h" 
#include "memory.h" 
#include "matrixcreation.h" 
#include <QMap> 
#include "matrix.h" 


namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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


private slots: 
    void on_createButton_clicked(); 
    void setMatrix(Matrix *matrix); 

private: 
    Matrix getMatrixFromMemory(QString &name); 
    void addMatrixToMemory(); 
    Ui::MainWindow *ui; 
    AddMatrix *add; 
    MatrixCreation *matrixCreate; 
    QMap <QString, Matrix> matrixMap; 
}; 

#endif // MAINWINDOW_H 

.cppファイル

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(MainWindow *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    this->setWindowTitle("Matrix Calculator"); 
    add = NULL; 
    matrixCreate = NULL; 


} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
    delete add; 
    delete matrixCreate; 
    matrixMap.clear(); 

} 


void MainWindow::on_createButton_clicked() 
{ 
    if (add != NULL) 
    { 
     delete add; 
     add = new AddMatrix; 
    } 
    else 
     add = new AddMatrix; 
    if (matrixCreate != NULL) 
    { 
     ui->label->setText(getMatrixFromMemory(matrixCreate->getMatrix()->getName()).getName()); 
     delete matrixCreate; 
     matrixCreate = new MatrixCreation; 
    } 
    else 
     matrixCreate = new MatrixCreation; 

    // Polaczenie sygnalow ze slotami 

    // Sluzy ustawieniu liczby wierszy w matrixCreate 
    connect(add->getCombo1(), SIGNAL(currentIndexChanged(QString)), matrixCreate, SLOT(setRows(QString))); 

    // Jak wyzej, tylko kolumn 
    connect(add->getCombo2(), SIGNAL(currentIndexChanged(QString)), matrixCreate, SLOT(setColumns(QString))); 

    // Ustawienie pola name w matrixCreate 


     connect(add->getEdit(), SIGNAL(textChanged(QString)), matrixCreate, SLOT(setName(QString))); 

     // Po ustawieniu liczby wierszy i kolumn oraz nazwy macierzy - wywola sie slot updateTable 
     // ktory sluzy do ustawienia rozmiaru okna i tabeli 
     connect(add, SIGNAL(setupSuccessful()), matrixCreate, SLOT(updateTable())); 

     // Po ustawieniu wierszy, kolumn, ustawieniu nazwy, rozmiarow, wywola sie slot show matrixCreate 
     connect(add, SIGNAL(setupSuccessful()), matrixCreate, SLOT(show())); 

     // Sluzy dodaniu macierzy do pamieci (mapy) 
     connect(matrixCreate, SIGNAL(matrixReady(Matrix*)), this, SLOT(setMatrix(Matrix*))); 

     add->show(); 
    } 

    void MainWindow::setMatrix(Matrix *matrix) 
    { 
     matrixMap[matrix->getName()] = *matrix; 
    } 

    Matrix MainWindow::getMatrixFromMemory(QString &name) 
    { 
     return matrixMap[name]; 
    } 

これは私のメイン・ウィンドウクラスです。私はまた、matrixCreateというMatrixCreationクラスのインスタンスを持っています。私は、この信号をemitingによりQMapに作成されたマトリックスを追加したい :問題は何

#ifndef MATRIXCREATION_H 
#define MATRIXCREATION_H 

#include <QDialog> 
#include <QTableView> 
#include <QPushButton> 
#include <QStandardItem> 
#include <QTableWidget> 
#include <QMainWindow> 
#include "matrix.h" 
#include "memory.h" 
#include "addmatrix.h" 
#include <windows.h> 




namespace Ui { 
class MatrixCreation; 
} 

class MatrixCreation : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit MatrixCreation(QWidget *parent = 0); 
    ~MatrixCreation(); 


    QTableWidget *getTable(); 
    Matrix *getMatrix(); 

private slots: 
    void on_okButton_clicked(); 
    void updateTable(); 
    void setRows(QString rows); 
    void setColumns(QString columns); 
    void setName(QString name); 

signals: 
    void matrixReady(Matrix *matrix); 

private: 
    Ui::MatrixCreation *ui; 
    int rows; 
    int columns; 
    int **matrix; 
    QString name; 
    Matrix *newMatrix; 
}; 

#endif // MATRIXCREATION_H 

.cppファイル

#include "matrixcreation.h" 
#include "ui_matrixcreation.h" 


MatrixCreation::MatrixCreation(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::MatrixCreation) 
{ 
    ui->setupUi(this); 
    this->resize(150, 50); 

    // Ustawienie rozmiaru wysokosci wiersza na 40 piksele 
    ui->tableWidget->verticalHeader()->setDefaultSectionSize(40); 

    // Ustawienie rozmiaru szerokosci kolumny na 94 piksele 
    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(94); 

    // Dopasowanie rozmiaru kolumn do rozmiaru tabeli 
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); 
    ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); 

    // Wylaczenie scrollbarow tabeli 
    ui->tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

    rows = 1; 
    columns = 1; 
    matrix = NULL; 
    newMatrix = new Matrix; 

} 

MatrixCreation::~MatrixCreation() 
{ 
    delete ui; 
    if (matrix != NULL) 
    { 
     for (int i = 0; i < rows; i++) 
      delete matrix[i]; 
    } 
    delete newMatrix; 
} 

void MatrixCreation::setRows(QString rows) 
{ 
    this->rows = rows.toInt(); 
} 

void MatrixCreation::setColumns(QString columns) 
{ 
    this->columns = columns.toInt(); 
} 

// Metoda odpowiedzialna za utworzenie odpowiedniej ilosci wierszy i kolumn 
// oraz ustawienie odpowiedniej wielkosci okna i rozmiaru tabeli 
void MatrixCreation::updateTable() 
{ 
    // stale roznice miedzy szerokoscia i wysokoscia okna i tabeli 
    int w = 323 - 305; 
    int h = 300 - 227 + 15; 

    for(int i = 0; i < rows; i++) 
    { 
     ui->tableWidget->insertRow(i); 
     h += 35; 
    } 
    for(int j = 0; j < columns; j++) 
    { 
     ui->tableWidget->insertColumn(j); 
     w += 50; 
    } 
    this->resize(w, h); 
    this->setMinimumSize(w, h); 

    ui->retranslateUi(this); 
    this->setWindowTitle("Matrix Creation"); 
} 

QTableWidget *MatrixCreation::getTable() 
{ 
    return ui->tableWidget; 
} 

void MatrixCreation::on_okButton_clicked() 
{ 
    matrix = new int *[rows]; 
    for(int j = 0; j < rows; j++) 
    { 
     matrix[j] = new int[columns]; 
    } 

    for(int i = 0; i<rows; i++) 
    { 
     for(int j = 0; j<columns; j++) 
     { 
      matrix[i][j] = ui->tableWidget->item(i, j)->text().toInt(); 
     } 
    } 


    // Ustawienie pol skladowych w zmiennej newMatrix klasy Matrix 
    newMatrix->setColumns(columns); 
    newMatrix->setRows(rows); 
    newMatrix->setName(name); 
    newMatrix->setMatrix(matrix); 

    emit matrixReady(newMatrix); 



    this->close(); 
} 

void MatrixCreation::setName(QString name) 
{ 
    this->name = name; 
} 



Matrix *MatrixCreation::getMatrix() 
{ 
    return newMatrix; 
} 

:ここ

がMatrixCreationクラスです はmatrixReadyを発します(newMatrix);

Matrixクラスは、行列のすべての要素(行、列、セルと名前の値)を保持するために使用されます。 しかし、MatrixオブジェクトはQMapに追加されていません。しかし、MatrixCreationデストラクタでこの行を削除すると: delete newMatrix; これは機能します。

第二の問題: マップを破壊しながら、私は、自分のアプリケーションを閉じていますし、メインウィンドウのデストラクタが呼び出されるとき、それはエラーを示していますBLOC_TYPE_IS_VALID BLAのBLA ... 私はそれを修正する方法がわからない、しかし、私は維持されます試しにどんな助けもありがとう。

+0

は実は、私はもっと慎重にチェックしましたし、要素がQMapに追加されています。しかし、MainWindowのcreateMatrixを削除してもエラーは出ます。 – MindRoller

+0

あなたのデストラクタでは、あなたの行列は2次元配列です。あなたは '列'を削除しましたが、 '行'は削除していません。ループの最後に行列を削除する必要があります – Striker

+0

on_okButton_clicked()は複数回呼び出されていますか?そうであれば、呼び出されるたびに古い配列を削除せずに新しい配列を作成しています – Striker

答えて

0
void MainWindow::setMatrix(Matrix *matrix) 
{ 
    matrixMap[matrix->getName()] = *matrix; 
} 

マップにマップのコピーを追加しています。だからここに漏れがあります。

void MainWindow::setMatrix(Matrix *matrix) 
{ 
    matrixMap[matrix->getName()] = *matrix; 
    delete matrix; 
} 

これで問題が解決するはずです。アプリケーションのプロファイリングとメモリリークを見つけるため

使用valgrindの:http://valgrind.org/docs/manual/quick-start.html

関連する問題