Search code examples
c++qtqtguiqmainwindowqt-signals

Qt MainWindow crashing


Edit: I removed the destructor from the slot. But now I have memory leaking problems. Each new window that I open occupies some memory,and when I close it,the memory stays occupied

When I execute the program,and open new windows, they are opened normally. When I close any of them, the whole application crashes (not only that specific window),and I get the crash error.

What am I doing wrong?

mainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
class QHBoxLayout;
class QTextEdit;
class QWidget;
class QDialog;
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void closeWindow();
    void newWindow();

private:
    Ui::MainWindow *ui;
    MainWindow *tempMainWindow;
    QHBoxLayout * mainLyt;
    QTextEdit *txtEdit;
    QWidget *mainWidget;
};

#endif // MAINWINDOW_H

mainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QWidget>
#include <QHBoxLayout>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mainWidget=new QWidget();
    mainLyt=new QHBoxLayout();
    txtEdit=new QTextEdit();
    mainLyt->addWidget(txtEdit);
    mainWidget->setLayout(mainLyt);
    setCentralWidget(mainWidget);
    connect(ui->actionExit,SIGNAL(triggered()),this,SLOT(closeWindow()));
    connect(ui->actionNew,SIGNAL(triggered()),this,SLOT(newWindow()));
}

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

void MainWindow::closeWindow()
{
    this->close();
    delete txtEdit;
    delete mainLyt;
    delete mainWidget;
    this->~MainWindow();
}

void MainWindow::newWindow()
{
    tempMainWindow=new MainWindow(this);
    tempMainWindow->show();
}

Solution

  • Let us see your code:

    this->close();
    delete txtEdit;
    delete mainLyt;
    delete mainWidget;
    this->~MainWindow();
    

    You are trying to destroy them and for the next open you allocate them almost the same way.

    What you achieve here is basically performance penalty. I would suggest to hide, modify, and so on the unwanted items instead.