user2612344
user2612344

Reputation: 77

Qt UI Generator doesn't deallocate resource

this is a code generated from qt ui file , i see that the code use new keyword to allocate memory but there is not delete keyword in the class to delete allocated resource , is this mistake from qt developers or there is something else (no deallocated resource )?

/********************************************************************************
** Form generated from reading UI file 'canyyeffectcontrol.ui'
**
** Created by: Qt User Interface Compiler version 5.0.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_CANYYEFFECTCONTROL_H
#define UI_CANYYEFFECTCONTROL_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QSlider>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_canyyeffectcontrol
{
public:
    QGridLayout *gridLayout;
    QSlider *Threshold2Slider;
    QLabel *Threshold1Label;
    QLabel *ApertureSizeLabel;
    QLabel *Threshold2Label;
    QSpinBox *Threshold1Spin;
    QSpinBox *Threshold2Spin;
    QSpinBox *ApertureSizeSpin;
    QSlider *ApertureSizeSlider;
    QSlider *Threshold1Slider;
    QCheckBox *EL2GLabel;

    void setupUi(QWidget *canyyeffectcontrol)
    {
        if (canyyeffectcontrol->objectName().isEmpty())
            canyyeffectcontrol->setObjectName(QStringLiteral("canyyeffectcontrol"));
        canyyeffectcontrol->resize(432, 210);
        canyyeffectcontrol->setMinimumSize(QSize(153, 119));
        canyyeffectcontrol->setMaximumSize(QSize(432, 210));
        gridLayout = new QGridLayout(canyyeffectcontrol);
        gridLayout->setObjectName(QStringLiteral("gridLayout"));
        Threshold2Slider = new QSlider(canyyeffectcontrol);
        Threshold2Slider->setObjectName(QStringLiteral("Threshold2Slider"));
        Threshold2Slider->setOrientation(Qt::Horizontal);

        gridLayout->addWidget(Threshold2Slider, 4, 1, 1, 2);

        Threshold1Label = new QLabel(canyyeffectcontrol);
        Threshold1Label->setObjectName(QStringLiteral("Threshold1Label"));

        gridLayout->addWidget(Threshold1Label, 2, 0, 1, 1);

        ApertureSizeLabel = new QLabel(canyyeffectcontrol);
        ApertureSizeLabel->setObjectName(QStringLiteral("ApertureSizeLabel"));

        gridLayout->addWidget(ApertureSizeLabel, 5, 0, 1, 1);

        Threshold2Label = new QLabel(canyyeffectcontrol);
        Threshold2Label->setObjectName(QStringLiteral("Threshold2Label"));

        gridLayout->addWidget(Threshold2Label, 4, 0, 1, 1);

        Threshold1Spin = new QSpinBox(canyyeffectcontrol);
        Threshold1Spin->setObjectName(QStringLiteral("Threshold1Spin"));

        gridLayout->addWidget(Threshold1Spin, 2, 3, 1, 1);

        Threshold2Spin = new QSpinBox(canyyeffectcontrol);
        Threshold2Spin->setObjectName(QStringLiteral("Threshold2Spin"));

        gridLayout->addWidget(Threshold2Spin, 4, 3, 1, 1);

        ApertureSizeSpin = new QSpinBox(canyyeffectcontrol);
        ApertureSizeSpin->setObjectName(QStringLiteral("ApertureSizeSpin"));

        gridLayout->addWidget(ApertureSizeSpin, 5, 3, 1, 1);

        ApertureSizeSlider = new QSlider(canyyeffectcontrol);
        ApertureSizeSlider->setObjectName(QStringLiteral("ApertureSizeSlider"));
        ApertureSizeSlider->setOrientation(Qt::Horizontal);

        gridLayout->addWidget(ApertureSizeSlider, 5, 1, 1, 2);

        Threshold1Slider = new QSlider(canyyeffectcontrol);
        Threshold1Slider->setObjectName(QStringLiteral("Threshold1Slider"));
        Threshold1Slider->setOrientation(Qt::Horizontal);

        gridLayout->addWidget(Threshold1Slider, 2, 1, 1, 1);

        EL2GLabel = new QCheckBox(canyyeffectcontrol);
        EL2GLabel->setObjectName(QStringLiteral("EL2GLabel"));

        gridLayout->addWidget(EL2GLabel, 0, 0, 1, 1);


        retranslateUi(canyyeffectcontrol);

        QMetaObject::connectSlotsByName(canyyeffectcontrol);
    } // setupUi

    void retranslateUi(QWidget *canyyeffectcontrol)
    {
        canyyeffectcontrol->setWindowTitle(QApplication::translate("canyyeffectcontrol", "Canny effect control", 0));
        Threshold1Label->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 1", 0));
        ApertureSizeLabel->setText(QApplication::translate("canyyeffectcontrol", "Aperture size", 0));
        Threshold2Label->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 2", 0));
        EL2GLabel->setText(QApplication::translate("canyyeffectcontrol", "Enable L2G", 0));
    } // retranslateUi

};

namespace Ui {
    class canyyeffectcontrol: public Ui_canyyeffectcontrol {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_CANYYEFFECTCONTROL_H

is that mean that i should rewrite the code to release memory (unique_ptr for example) and the code should be like this

/********************************************************************************
** Form generated from reading UI file 'canyyeffectcontrol.ui'
**
** Created by: Qt User Interface Compiler version 5.0.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
** I modify the code 
********************************************************************************/

#ifndef UI_CANYYEFFECTCONTROL_H
#define UI_CANYYEFFECTCONTROL_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QSlider>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_canyyeffectcontrol
{
public:
    std::unique_ptr<QGridLayout> gridLayout;
    std::unique_ptr<QSlider> Threshold2Slider;
    std::unique_ptr<QLabel> Threshold1Label;
    std::unique_ptr<QLabel> ApertureSizeLabel;
    std::unique_ptr<QLabel> Threshold2Label;
    std::unique_ptr<QSpinBox>Threshold1Spin;
    std::unique_ptr<QSpinBox> Threshold2Spin;
    std::unique_ptr<QSpinBox> ApertureSizeSpin;
    std::unique_ptr<QSlider> ApertureSizeSlider;
    std::unique_ptr<QSlider> Threshold1Slider;
    std::unique_ptr<QCheckBox> EL2GLabel;

    void setupUi(QWidget *canyyeffectcontrol)
    {
        if (canyyeffectcontrol->objectName().isEmpty())
            canyyeffectcontrol->setObjectName(QStringLiteral("canyyeffectcontrol"));
        canyyeffectcontrol->resize(432, 210);
        canyyeffectcontrol->setMinimumSize(QSize(153, 119));
        canyyeffectcontrol->setMaximumSize(QSize(432, 210));
        gridLayout = std::unique_ptr<QGridLayout> (new QGridLayout(canyyeffectcontrol));
        gridLayout->setObjectName(QStringLiteral("gridLayout"));
        Threshold2Slider =  std::unique_ptr<QSlider>(new QSlider(canyyeffectcontrol));
        Threshold2Slider.get()->setObjectName(QStringLiteral("Threshold2Slider"));
        Threshold2Slider.get()->setOrientation(Qt::Horizontal);

        gridLayout.get()->addWidget(Threshold2Slider.get(), 4, 1, 1, 2);

        Threshold1Label = std::unique_ptr<QLabel> (new QLabel(canyyeffectcontrol));
        Threshold1Label.get()->setObjectName(QStringLiteral("Threshold1Label"));

        gridLayout.get()->addWidget(Threshold1Label.get(), 2, 0, 1, 1);

        ApertureSizeLabel = std::unique_ptr<QLabel> (new QLabel(canyyeffectcontrol));
        ApertureSizeLabel.get()->setObjectName(QStringLiteral("ApertureSizeLabel"));

        gridLayout.get()->addWidget(ApertureSizeLabel.get(), 5, 0, 1, 1);

        Threshold2Label =  std::unique_ptr<QLabel> (new QLabel(canyyeffectcontrol));
        Threshold2Label.get()->setObjectName(QStringLiteral("Threshold2Label"));

        gridLayout.get()->addWidget(Threshold2Label.get(), 4, 0, 1, 1);

        Threshold1Spin =  std::unique_ptr<QSpinBox> (new QSpinBox(canyyeffectcontrol));
        Threshold1Spin.get()->setObjectName(QStringLiteral("Threshold1Spin"));

        gridLayout.get()->addWidget(Threshold1Spin.get(), 2, 3, 1, 1);

        Threshold2Spin =  std::unique_ptr<QSpinBox> (new QSpinBox(canyyeffectcontrol));
        Threshold2Spin.get()->setObjectName(QStringLiteral("Threshold2Spin"));

        gridLayout->addWidget(Threshold2Spin.get(), 4, 3, 1, 1);

        ApertureSizeSpin =  std::unique_ptr<QSpinBox> (new QSpinBox(canyyeffectcontrol));
        ApertureSizeSpin.get()->setObjectName(QStringLiteral("ApertureSizeSpin"));

        gridLayout.get()->addWidget(ApertureSizeSpin.get(), 5, 3, 1, 1);

        ApertureSizeSlider =std::unique_ptr<QSlider> (new QSlider(canyyeffectcontrol));
        ApertureSizeSlider.get()->setObjectName(QStringLiteral("ApertureSizeSlider"));
        ApertureSizeSlider.get()->setOrientation(Qt::Horizontal);

        gridLayout->addWidget(ApertureSizeSlider.get(), 5, 1, 1, 2);

        Threshold1Slider =std::unique_ptr<QSlider> (new QSlider(canyyeffectcontrol));
        Threshold1Slider.get()->setObjectName(QStringLiteral("Threshold1Slider"));
        Threshold1Slider.get()->setOrientation(Qt::Horizontal);

        gridLayout.get()->addWidget(Threshold1Slider.get(), 2, 1, 1, 1);

        EL2GLabel = std::unique_ptr<QCheckBox> (new QCheckBox(canyyeffectcontrol));
        EL2GLabel.get()->setObjectName(QStringLiteral("EL2GLabel"));

        gridLayout.get()->addWidget(EL2GLabel.get(), 0, 0, 1, 1);


        retranslateUi(canyyeffectcontrol);

        QMetaObject::connectSlotsByName(canyyeffectcontrol);
    } // setupUi

    void retranslateUi(QWidget *canyyeffectcontrol)
    {
        canyyeffectcontrol->setWindowTitle(QApplication::translate("canyyeffectcontrol", "Canny effect control", 0));
        Threshold1Label.get()->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 1", 0));
        ApertureSizeLabel.get()->setText(QApplication::translate("canyyeffectcontrol", "Aperture size", 0));
        Threshold2Label.get()->setText(QApplication::translate("canyyeffectcontrol", "Threshold size 2", 0));
        EL2GLabel.get()->setText(QApplication::translate("canyyeffectcontrol", "Enable L2G", 0));
    } // retranslateUi

};

namespace Ui {
    class canyyeffectcontrol: public Ui_canyyeffectcontrol {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_CANYYEFFECTCONTROL_H

Upvotes: 5

Views: 284

Answers (3)

JBL
JBL

Reputation: 12907

No ! You shouldn't modify Qt's generated files.

First reason (in the very header of the file generated) :

WARNING! All changes made in this file will be lost when recompiling UI file!

That means your modifications will be lost each time you modify even the tiniest bit of your UI (which is by itself a terrible problem, having to modify it time and time again with every UI change)

Secondly, Qt handles memory in its own way, with a mechanism of parent/child widgets that take care themselves of memory handling. You can find about this here and here.

For generated files, you shouldn't have to care about that. Then, for your own file (custom widgets for example), you shouldn't use delete either but look after QObject::deleteLater()

Upvotes: 3

arne
arne

Reputation: 4674

The Qt framework builds up a tree of parent-child relationships. The constructor argument for the QSliders for example is the parent. Upon destruction of the parent, all children are recursively destroyed, too, so there's no need for you to clean up anything, if you've got your parent-child relationships right.

If there's still memory loss (check with valgrind), this might be a Qt bug or you haven't set up the relationships right.

Upvotes: 0

Paul Dixon
Paul Dixon

Reputation: 300825

Read up on how QObject derived classes manage memory - in a nutshell, if a QObject is constructed with a parent, then it will be destroyed when the parent is destroyed. In your example, it looks like everything is created as a child of canyyeffectcontrol, so those objects will be destroyed when that is.

Upvotes: 5

Related Questions