Название: 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 ну да.
Код
Что будет с памятью после этого? В сто раз больше утечет или столько же. Название: Re: destroy() не освобождает память? Отправлено: Ubuntu_linux от Ноябрь 03, 2011, 09:40 ну да. Ну это чуток не к тому относиться, сейчас мы говорим об qml!Код
Что будет с памятью после этого? В сто раз больше утечет или столько же. Название: Re: destroy() не освобождает память? Отправлено: Bepec от Ноябрь 03, 2011, 09:49 Ubuntu_linux - если это утечка, то и на паскале это будет утечкой, и будет таким же циклом выявляться.
Сейчас мы говорим о ПАМЯТИ и утечке ЕЁ. А не о языке, на котором она происходит. andrew.k дельные советы дает - ты сначала их выполни, ему результат верни, и он тебе уже разложит по полочкам (и я приду помогу разложить). Название: Re: destroy() не освобождает память? Отправлено: Ubuntu_linux от Ноябрь 04, 2011, 19:32 Уговорили, делаю так:
Код В результате, память стоит на месте 1,7МБ стоит на месте, если убрать delete wid то соответственно память очень бистро увеличивается. Название: Re: destroy() не освобождает память? Отправлено: Ubuntu_linux от Ноябрь 04, 2011, 20:00 Для QML такого цикла не делал, но если в ручную создавать и удалять объекты то память увеличивается! Почему так?
Код
Название: 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) { А сам TestComponent.qml Код: import QtQuick 2.7 Вызов 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). Может попробовать? Код
Название: Re: destroy() не освобождает память? Отправлено: twp от Май 03, 2017, 15:40 Есть еще функция
Цитировать gc() function: This function is specific to QML, and provides a way to manually trigger garbage collection |