Утечка памяти в QListWidget

Итак, у меня есть этот метод:

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).

1

Решение

Я написал простой пример с 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 явным образом: Тот же вывод.

0

Другие решения


По вопросам рекламы [email protected]