Утечка памяти в QT5 при hide() или show() окна
Не сильно шарю в разработке c++
Вот решил попробовать себя в qt5, c++
Использую qtcreator.
Столкнулся с такой проблемой, как утечка памяти, при переключении окон.
Притом проблема только с одним окном. При его hide() ( или show() точно не уверен ) в процессах прибавляется память, но назад уже не убавляется.
Методы не переопределены, ничего вроде как не делается, не считая метода set(), который перед этим заносит значения. Но я пробовал не вызывать метод set() и просто вызывать show() таже штука.
Сам класс создается один раз. Добавляется в центральный виджет и потом уже посредством сигналов главное окно скрывает или показывает нужное окно. То есть никакого пересоздания объекта нет. Но все равно откудато утечка памяти.
Утечка начинается не сразу, а примерно через 10 открытый и закрытий.
Возможно какая-нибудь самая тупая ошибка в моем стиле, но хоть убей не вижу прикола.
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>editTask</class>
<widget class="QWidget" name="editTask">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>326</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lTitle">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Редактирование задачи</string>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lName">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Наименование задачи</string>
</property>
<property name="alignment">
<set>Qt::AlignBottom|Qt::AlignHCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="fieldName"/>
</item>
<item>
<widget class="QLabel" name="lDeadline">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Сроки сдачи</string>
</property>
<property name="alignment">
<set>Qt::AlignBottom|Qt::AlignHCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QDateTimeEdit" name="fieldDeadline"/>
</item>
<item>
<widget class="QLabel" name="lDescription">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Описание</string>
</property>
<property name="alignment">
<set>Qt::AlignBottom|Qt::AlignHCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="fieldDescription"/>
</item>
<item>
<widget class="QLabel" name="lStatus">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Статус задачи</string>
</property>
<property name="alignment">
<set>Qt::AlignBottom|Qt::AlignHCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="fieldStatus">
<item>
<property name="text">
<string>Ожидает выполнения</string>
</property>
</item>
<item>
<property name="text">
<string>В работе</string>
</property>
</item>
<item>
<property name="text">
<string>Выполнено</string>
</property>
</item>
<item>
<property name="text">
<string>Просрочено</string>
</property>
</item>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="btns">
<item>
<widget class="QPushButton" name="btnCancel">
<property name="text">
<string>Отмена</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnSave">
<property name="text">
<string>Сохранить</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
#ifndef EDITTASK_H
#define EDITTASK_H
#include <QWidget>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
namespace Ui {
class editTask;
}
class editTask : public QWidget
{
Q_OBJECT
public:
explicit editTask(QWidget *parent = nullptr);
~editTask();
void set(int id, QString name, QString deadline, QString description, int status);
signals:
void showWinTasks();
private:
Ui::editTask *ui;
int id;
private slots:
void onSave();
};
#endif // EDITTASK_H
#include "edittask.h"
#include "ui_edittask.h"
editTask::editTask(QWidget *parent) :
QWidget(parent),
ui(new Ui::editTask)
{
ui->setupUi(this);
connect(ui->btnCancel, SIGNAL( clicked() ),this, SIGNAL( showWinTasks() ) );
connect(ui->btnSave, SIGNAL( clicked() ), this, SLOT( onSave() ));
}
void editTask::set(int id, QString name, QString deadline, QString description, int status) {
this->id = id;
ui->fieldName->setText(name);
ui->fieldDescription->setPlainText(description);
ui->fieldDeadline->setDateTime(QDateTime::fromString(deadline,"yyyy-MM-dd hh:mm:ss"));
ui->fieldStatus->setCurrentIndex(status);
}
void editTask::onSave() {
QSqlQuery query;
query.prepare("update tasks set name = ?, deadline = ?, description = ?, status = ? where id = ?");
query.bindValue(0,ui->fieldName->text());
query.bindValue(1,ui->fieldDeadline->dateTime().toString("yyyy-MM-dd hh:mm:ss"));
query.bindValue(2,ui->fieldDescription->toPlainText());
query.bindValue(3,ui->fieldStatus->currentIndex());
query.bindValue(4,id);
if (!query.exec()) {
qDebug() << "Не удалось обновить запись: "+query.lastError().text();
}
query.clear();
query.finish();
emit showWinTasks();
}
editTask::~editTask()
{
delete ui;
}