2014-11-29 5 views
0

Мы разрабатываем приложение с Qt/Qml (Qml встроен в QWidget). При удалении QWidget, содержащего QQuickView (встроенный), выделенная память не будет полностью освобождена.Проблема с управлением памятью с удалением QQuickView в Qt5.3 (mingw32)

Добавив QWidget в приложение, будет выделено около 30 МБ памяти, но когда виджет удалит, будет освобождено только около 20 МБ памяти.

В деструкторе QWidget я удалил экземпляр QQuickView, и нет других больших объектов.

Кроме того, я уверен, что QQuickView не освобождает память должным образом.

Как освободить всю память, выделенную QQuickView?

ПРИМЕЧАНИЕ: Код действительно большой (160000 строк), поэтому я не могу поставить пример кода.

Заранее спасибо ...

+0

Как вы оцениваете, что при добавлении QWidget 30MB получает выделяется и освобождая только 20MB ?. –

+0

Обязательно объявите деструктор ваших базовых классов виртуальным, если ваша программа имеет базовый класс. Это обеспечивает свободный доступ к ресурсам всеми классами, связанными с этим конкретным объектом. –

+0

@MantoshKumar Проверяя его в «Диспетчере задач Windows». – Mosi

ответ

3

я написал быстрый тест, чтобы определить, есть ли фактическая утечка в создании и делеция 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 

 Смежные вопросы

  • Нет связанных вопросов^_^