Russian Qt Forum

Qt => Qt Quick => Тема начата: Ubuntu_linux от Ноябрь 02, 2011, 23:00



Название: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Ноябрь 02, 2011, 23:00
Есть компонент Component{id: componentID; ........}
создаю его динамически componentID.createObject(baseRectID)
Потом удаляю его вызвав метод destroy() в средине айтема в компоненте.
Но память не освобождается, что я не так делаю?


Название: Re: destroy() не освобождает память?
Отправлено: andrew.k от Ноябрь 02, 2011, 23:53
"Шо, опять?!" - Волк из мультфильма (с)

А может так и должно быть, и освобожденная память "не отбирается" у приложения, пока она не понадобится системе?
Это мое предположение.


Название: Re: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Ноябрь 03, 2011, 00:05
"Шо, опять?!" - Волк из мультфильма (с)

А может так и должно быть, и освобожденная память "не отбирается" у приложения, пока она не понадобится системе?
Это мое предположение.
Хз, но в с++ все освобождается...
А в qml почемуто нет ....


Название: Re: destroy() не освобождает память?
Отправлено: andrew.k от Ноябрь 03, 2011, 00:26
А если сто раз в цикле создать и удалить? Что с памятью будет?


Название: Re: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Ноябрь 03, 2011, 00:33
А если сто раз в цикле создать и удалить? Что с памятью будет?
Что сделать, дестрой?


Название: Re: destroy() не освобождает память?
Отправлено: andrew.k от Ноябрь 03, 2011, 00:38
ну да.
Код
C++ (Qt)
for ( int i = 0; i < 100; i++ )
{
 obj = new Object();
 delete obj;
}

Что будет с памятью после этого?
В сто раз больше утечет или столько же.


Название: Re: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Ноябрь 03, 2011, 09:40
ну да.
Код
C++ (Qt)
for ( int i = 0; i < 100; i++ )
{
 obj = new Object();
 delete obj;
}

Что будет с памятью после этого?
В сто раз больше утечет или столько же.
Ну это чуток не к тому относиться, сейчас мы говорим об qml!


Название: Re: destroy() не освобождает память?
Отправлено: Bepec от Ноябрь 03, 2011, 09:49
Ubuntu_linux - если это утечка, то и на паскале это будет утечкой, и будет таким же циклом выявляться.

Сейчас мы говорим о ПАМЯТИ и утечке ЕЁ. А не о языке, на котором она происходит. andrew.k дельные советы дает - ты сначала их выполни, ему результат верни, и он тебе уже разложит по полочкам (и я приду помогу разложить).


Название: Re: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Ноябрь 04, 2011, 19:32
Уговорили, делаю так:
Код
C++ (Qt)
while(true)
{
       wid = new QWidget(this);
     delete wid;
   }
В результате, память стоит на месте 1,7МБ стоит на месте, если убрать delete wid то соответственно память очень бистро увеличивается.




Название: Re: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Ноябрь 04, 2011, 20:00
Для QML  такого цикла не делал, но если в ручную создавать и удалять объекты то память увеличивается! Почему так?

Код
QBasic/QuickBASIC
   Component{
       id:aboutComponentID
       About{
           id: aboutID
           anchors.fill: parent
           aboutImageSource: "icon/aboutText.png"
           onStartVibro:  baseRect.startVibro()
       }//aboutID
   }//aboutComponentID


Название: Re: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Ноябрь 07, 2011, 03:22
Так как бить с памятью?


Название: Re: destroy() не освобождает память?
Отправлено: Bepec от Январь 26, 2012, 19:15
Уже написали, делай блин цикл, ленивец антарктический, на qml.
И за пару минут выяснишь, это фича или утечка.


Название: Re: destroy() не освобождает память?
Отправлено: Ubuntu_linux от Январь 26, 2012, 23:07
Но иногда надо четко удалить обект и создать заново. И как тогда сделать?


Название: Re: destroy() не освобождает память?
Отправлено: Bepec от Январь 27, 2012, 06:54
Сначала сделай цикл и выясни. Если память утекать не будет, значит то фича такая, а не утечка.

А объект у тебя удаляется чётко. И так же чётко воссоздаётся. Просто выясни что с памятью у тебя ^^


Название: Re: destroy() не освобождает память?
Отправлено: OKTA от Январь 27, 2012, 07:19
Не надо бояться того, что qml не освобождает память мгновенно. У него свои механизмы по освобождению памяти - он ее освободит, но потом, когда точно память уже точно не понадобится))) Такие "утечки" происходят даже, если в ListView с ListModel добавлять новые айтемы тектстовые и тут же их удалять! Память будет забиваться, но! До определенного момента! МОжете проверить - выше какого-то значения она не поползет. Не могу сказать до какого и почему, но факт остается фактом))


Название: Re: destroy() не освобождает память?
Отправлено: Slash от Март 17, 2017, 17:29
Вот пример цикла в qml:
Код:
function allocateObject(parent) {
    var component = Qt.createComponent("TestComponent.qml");
    for(var i = 0 ; i < 30000 ; i++) {
        var object = component.createObject(parent);
        object.destroy()
    }
}

А сам TestComponent.qml
Код:
import QtQuick 2.7

Item {
    property string name: "item"
}

Вызов allocateObject съедает 40Mb памяти, которая по истечении времени так и не освободится. Повторный вызов съедает еще 13Mb. Тут для примера взят совсем примитивный компонент. В реальности компонент намного сложнее. И конечно не 30000 их создается.
И как же тогда быть с памятью?


Название: Re: destroy() не освобождает память?
Отправлено: andrew.k от Май 02, 2017, 23:16

Вызов allocateObject съедает 40Mb памяти, которая по истечении времени так и не освободится. Повторный вызов съедает еще 13Mb. Тут для примера взят совсем примитивный компонент. В реальности компонент намного сложнее. И конечно не 30000 их создается.
И как же тогда быть с памятью?

Objects are not destroyed the instant destroy() is called, but are cleaned up sometime between the end of that script block and the next frame (unless you specified a non-zero delay).
Может попробовать?
Код
C++ (Qt)
object.destroy(0);


Название: Re: destroy() не освобождает память?
Отправлено: twp от Май 03, 2017, 15:40
Есть еще функция
Цитировать
gc() function: This function is specific to QML, and provides a way to manually trigger garbage collection