Не вызвается деструктор касса Qt Widget

351
12 ноября 2017, 17:18

Есть 2 класса виджетов. Я хотел сделать так, что при нажатии кнопки, виджет на котором я сейчас нахожусь удалился и открыл мне новый класс с виджетом. Проблема в том, что деструктор Logwindow в консоль не выводит, и как я понимаю удаление не происходит. Пробовал использовать и deleteLater() метод, но не знаю как проверить освобождение памяти с ним. Вот код:

Loginwindow.cpp:

Logwindow::Logwindow(QWidget *parent):
QWidget(parent),
ui(new Ui::loginwindow)
{
    ui->setupUi(this);
    ui->pas_edit->setEchoMode(QLineEdit::Password);
    connect(ui->reg_button, &QPushButton::clicked, this, &Logwindow::customSignal);
    connect(ui->log_button, &QPushButton::clicked, this, &Logwindow::loginSignal);
}
Logwindow::~Logwindow()
{
    std::cout << "Delete Logwindow";
}

Logwindow.hpp:

namespace Ui 
{
    class Loginwindow;
}
class Logwindow:public QWidget
{
    Q_OBJECT
public:
    explicit Logwindow(const QString &text, QWidget *parent=Q_NULLPTR);
    ~Logwindow();
signals:
    void customSignal();
    void loginSignal();
private:
    Ui::loginwindow *ui;
};

Regwindow.h:

namespace Ui 
{
    class Regwindow;
}
class Regwindow:public QWidget
{
public:
   explicit Regwindow(QWidget *parent=Q_NULLPTR);
private:
    QLabel *label;
    Ui::regwindow *ui;
};

Regwindow.cpp:

Regwindow::Regwindow(QWidget *parent):
QWidget(parent),
ui(new Ui::regwindow)
{
    ui->setupUi(this);
    ui->r_passEdit->setEchoMode(QLineEdit::Password);
    ui->r_secpassEdit->setEchoMode(QLineEdit::Password);
}

main.cpp:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);  
    Logwindow *log = new Logwindow("LogWindow");
    Regwindow *reg;
    QObject::connect(log, &Logwindow::customSignal, [&reg, &log](){
        reg = new Regwindow();
        reg->show();
        log->~Logwindow();
});
    log->show();
    return a.exec();
}
Answer 1
  1. Строка log->~Logwindow(); выглядит очень странно. Не надо вызывать деструктор явно, оставляя при этом «висящую» область памяти. Удаляйте полноценно, через delete — он сам неявно вызывает деструктор.

  2. Обязательно посылайте в консоль std::endl. Содержимое std::cout кэшируется, и потому вывод может отсутствовать из-за отсутствия команды на сброс этого кэша (чем endl и занимается).

READ ALSO
Подскажите с++ библиотеку для работы с разреженными матрицами

Подскажите с++ библиотеку для работы с разреженными матрицами

В ходе написания программы я столкнулся с необходимостью решения СЛАУ где А -- разреженная матрицаОчень хотелось бы воспользоваться готовым...

383
Массив обьектов. Шаблоны классов С++

Массив обьектов. Шаблоны классов С++

Как создать массив обьектов из шаблонных классов? Вот моя попытка

393
std::cout не выводит данные в консоль

std::cout не выводит данные в консоль

У меня есть код, который выводит в консоль некоторый текст:

329
Удаление QDialog с помощью delete

Удаление QDialog с помощью delete

Имеется следующий кусочек кода:

290