Проблема управления памятью при удалении QQuickView в Qt5.3(mingw32)
Мы разрабатываем приложение с помощью Qt/Qml (Qml встроен в QWidget). При удалении QWidget, который содержит QQuickView (встроенный), выделенная память не будет полностью освобождена.
При добавлении QWidget в приложение будет выделено около 30 МБ памяти, но при удалении виджета будет освобождено только около 20 МБ памяти.
В деструкторе QWidget я удалил экземпляр QQuickView, и других больших объектов нет.
Кроме того, я уверен, что QQuickView не освобождает память должным образом.
Как я могу освободить всю память, выделенную QQuickView?
ПРИМЕЧАНИЕ: код действительно большой (160000 строк), поэтому я не могу поместить пример кода.
Заранее спасибо...
1 ответ
Я написал быстрый тест, чтобы определить, есть ли фактическая утечка в создании и удалении QQUickWidget
:
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget *parent = 0) : QWidget(parent) {
widget = 0;
count = 0;
resize(200, 200);
layout = new QVBoxLayout(this);
setLayout(layout);
QTimer * t = new QTimer(this);
t->setInterval(200);
t->setSingleShot(false);
t->start();
connect (t, SIGNAL(timeout()), this, SLOT(toggleQuickView()));
}
public slots:
void toggleQuickView() {
if (!widget) {
widget = new QQuickWidget;
widget->setSource(QUrl::fromLocalFile("d:\\main.qml"));
connect(widget, SIGNAL(destroyed()), this, SLOT(echo()));
layout->addWidget(widget);
} else {
layout->removeWidget(widget);
widget->deleteLater();
widget = 0;
}
}
void echo() {
PROCESS_MEMORY_COUNTERS memcount;
if (!GetProcessMemoryInfo(GetCurrentProcess(), &memcount, sizeof(memcount))) return;
qDebug() << ++count << "created and destroyed," << memcount.WorkingSetSize / (1024 * 1024) << "MB memory used";
}
private:
QVBoxLayout * layout;
QQuickWidget * widget;
int count;
};
У него есть таймер, который создает / уничтожает QQuickWidget
с загруженным файлом QML внутри, и хотя результаты первоначально увеличиваются, использование памяти стабилизируется во времени, указывая на то, что маловероятно, что в коде Qt произошла утечка памяти, и что если вы действительно утечки памяти, ошибка не ложь в Qt, но в вашем собственном коде.
Также стоит упомянуть, что диспетчер задач фактически показал процесс, использующий меньше памяти, чем GetProcessMemoryInfo()
и я думаю, что последний является более точной мерой из двух. Чтение менеджера задач также не указывало на утечку памяти, хотя его значение колебалось больше.
Вот вывод:
1 created and destroyed, 41 MB memory used
2 created and destroyed, 44 MB memory used
3 created and destroyed, 44 MB memory used
4 created and destroyed, 48 MB memory used
5 created and destroyed, 48 MB memory used
6 created and destroyed, 48 MB memory used
7 created and destroyed, 48 MB memory used
8 created and destroyed, 48 MB memory used
9 created and destroyed, 48 MB memory used
10 created and destroyed, 48 MB memory used
11 created and destroyed, 52 MB memory used
12 created and destroyed, 52 MB memory used
13 created and destroyed, 52 MB memory used
14 created and destroyed, 52 MB memory used
15 created and destroyed, 52 MB memory used
16 created and destroyed, 52 MB memory used
17 created and destroyed, 52 MB memory used
18 created and destroyed, 52 MB memory used
19 created and destroyed, 52 MB memory used
20 created and destroyed, 52 MB memory used
21 created and destroyed, 53 MB memory used
...
50 created and destroyed, 53 MB memory used
...
100 created and destroyed, 53 MB memory used
...
200 created and destroyed, 53 MB memory used
...
500 created and destroyed, 53 MB memory used