Итак, у меня есть этот метод:
void SomeClass::SomeMethod() {
QString information;
QListWidgetItem *dataline = new QListWidgetItem();
information = "stuff & more stuff";
dataline->setText(information);
dataline->setFont(QFont("Monospace"));
dataline->setStuff(moreStuff::things);
//! listData is a pointer to QListWidget object.
ui.listData->insertItem(ui.listData.count(), dataline);
} //! Boom, memory leak!
В Qt docs это говорит примерно так:
Если вам нужно вставить новый элемент в список на определенном
положение, то оно должно быть построено без родительского виджета.
Затем следует использовать функцию insertItem (), чтобы поместить ее в список.
Виджет списка станет владельцем элемента.
Но VLD
(Visual Leak Detector) обнаруживает утечку памяти каждый раз, когда я вызываю этот метод.
1) Есть VLD
собственно правильно об этом и есть утечка памяти?
2) Есть ли другой способ решения этой проблемы? (Я старался не выделять кучу dataline
и передать его адрес insertItem
метод, но, похоже, не работает.
РЕДАКТИРОВАТЬ:
Это класс, который содержит ui
объект:
#include "ui_Validator.h"
class Validator: public QMainWindow {
Q_OBJECT
public:
Validator(QWidget *parent = 0);
~Validator();
public slots:
void stuff1();
void stuff2();
void stuff3();
void stuff4(const QString &data);
void stuff5(const Rats &data);
signals:
void startGeneratingSignal(Cat param);
void stopGeneratingSignal(Dog param);
void initStuff();
void configStuff(Rats param);
void stopThreadIOloop();
private:
Ui::Validator ui; //! This object is from Qt-generated ui_Validator.h.
SomeThreadObj *objActivity;
QThread *objActivity;
SomeInterface interface;
};
И деструктор из файла cpp:
Validator::~Validator() {
//! EDIT: It's ok, when this destructor is called, it means that all the application is closed, so there is no need for explicit cleanup, the OS will take care of that.
ui.listData->clear();
emit killIOloop();
qDebug() << "~Validator";
}
Итак, как вы можете видеть, ui
Объект создается в первый раз, когда запускается программа (главное окно), и выходит из области видимости, когда вызывается деструктор (при выходе из приложения) (по некоторым причинам я намеренно не удаляю objActivity
а также objActivity
).
Я написал простой пример с VLD и кодом ниже:
test1::test1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QString information;
QListWidgetItem *dataline = new QListWidgetItem();
information = "stuff & more stuff";
//Dataline dataline = new Dataline();
dataline->setText("test");
dataline->setFont(QFont("Monospace"));//! listData is a pointer to QListWidget object.
ui.listData->insertItem(ui.listData->count(), dataline);
}
test1::~test1()
{
}
После закрытия MainWindow вызывается деструктор QListModel, который удаляет все элементы ListWidget чистым методом.
Выход VLD:
No memory leaks detected.
Visual Leak Detector is now exiting.
Если вы вызываете метод Clear объекта ListWidget явным образом: Тот же вывод.