почему у меня возникает утечка памяти при выполнении наследования класса QWidget в Qt - PullRequest
0 голосов
/ 03 июля 2018

Я новичок в C ++. Я пытаюсь создать один класс, унаследовав базовый класс QWidget но я получаю утечку памяти при создании этого класса через новый. здесь ниже у меня есть фрагмент кода класса и основного приложения

#include "QWidget"
#include "QDebug"
#include "ui_myobject.h"

namespace Ui {    
    class MyObject;    
}

class MyObject : public QWidget{    
    Q_OBJECT    
public:       
    explicit MyObject();
    ~MyObject();
    Ui::MyObject *ui; 
};

#include "myobject.h"
#include "ui_myobject.h"

MyObject::MyObject() : QWidget(),ui(new Ui::MyObject){    
    ui->setupUi(this);
    qDebug() << "MyObject Initilised";
}
MyObject::~MyObject(){    
    delete ui;
    qDebug() << "MyObject Deinitilised";    
}

class Application : public QWidget
{
    Q_OBJECT    
public:
    explicit Application(QWidget *parent = 0);    
    ~Application();     
    MyObject *m_MyObject;       
};  

Application::Application(QWidget *parent) :QWidget(parent),ui(new Ui::Application){    
ui->setupUi(this);    
}    

Я вызываю эту функцию через щель освобождения щелчка кнопки

void somefunction()
    {
      m_MyObject = new MyObject();
                //mAlarm_main->Alarm();    
                m_MyObject->show();    
                delete m_MyObject;
    }


int main(int argc, char *argv[])
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
    ; // Qt5 uses different graphical backend
#else
    QApplication::setGraphicsSystem("raster");
#endif

    QApplication a(argc, argv);
    Application w;

    // uncomment this line to remove window frame
    //w.setWindowFlags(Qt::FramelessWindowHint);

    w.setGeometry(0,0,800,480);

    w.show();

    return a.exec();
}

Когда я вызываю некоторую функцию, у меня утечка памяти в моем приложении. Я наблюдаю за размером стека, используя команду top, которая непрерывно увеличивается на 2 mb после 200 times моего приложения. Я удаляю свой объект, но все же возникают утечки памяти, есть ли другой способ удалить QWidget

Если я не вызову m_MyObject-> show (); Функция утечки памяти не происходит.

1 Ответ

0 голосов
/ 03 июля 2018

В следующем фрагменте кода вы удаляете только что показанный виджет (метод show не блокируется). Я считаю, что это вызывает неопределенное поведение и, возможно, утечку памяти, о которой вы беспокоитесь:

  m_MyObject = new MyObject();
  m_MyObject->show();
  delete m_MyObject;

Если предположить, что вам нужен только один MyObject за раз, я бы предложил создать MyObject только один раз (не забудьте инициализировать его с nullptr по умолчанию)

if (!m_MyObject)
    m_MyObject = new MyObject();
m_MyObject->show();

Другой способ ( выглядит так, как будто этот виджет должен отображаться в отдельном окне ) - установить атрибут Qt :: WA_DeleteOnClose (см. QWidget :: close для деталей).

    m_MyObject = new MyObject();
    m_MyObject->setAttribute(Qt::WA_DeleteOnClose, true);
    m_MyObject->show();

Пример:

#include <QApplication>
#include <QPushButton>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QWidget* w = nullptr;
    QPushButton b;
    b.setText("Button");
    b.connect(&b, &QPushButton::clicked, [&w]() {
        w = new QWidget();
        w->setAttribute(Qt::WA_DeleteOnClose, true); // ADD THIS LINE
        w->show();
        // delete w; // DON'T DO IT
    });
    b.show();

    return app.exec();
}
...