Russian Qt Forum
Май 26, 2018, 09:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: destroy() не освобождает память?  (Прочитано 3706 раз)
Ubuntu_linux
Гость
« : Ноябрь 02, 2011, 23:00 »

Есть компонент Component{id: componentID; ........}
создаю его динамически componentID.createObject(baseRectID)
Потом удаляю его вызвав метод destroy() в средине айтема в компоненте.
Но память не освобождается, что я не так делаю?
Записан
andrew.k
Гуру общения
******
Offline Offline

Сообщений: 1567


*ерес - местный сумасшедший


Просмотр профиля
« Ответ #1 : Ноябрь 02, 2011, 23:53 »

"Шо, опять?!" - Волк из мультфильма (с)

А может так и должно быть, и освобожденная память "не отбирается" у приложения, пока она не понадобится системе?
Это мое предположение.
« Последнее редактирование: Ноябрь 03, 2011, 00:00 от andrew.k » Записан

"Вообще он что должен делать мне неясно и вотому что можно сделать тоже не могу." (С) Верес
Ubuntu_linux
Гость
« Ответ #2 : Ноябрь 03, 2011, 00:05 »

"Шо, опять?!" - Волк из мультфильма (с)

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

Сообщений: 1567


*ерес - местный сумасшедший


Просмотр профиля
« Ответ #3 : Ноябрь 03, 2011, 00:26 »

А если сто раз в цикле создать и удалить? Что с памятью будет?
Записан

"Вообще он что должен делать мне неясно и вотому что можно сделать тоже не могу." (С) Верес
Ubuntu_linux
Гость
« Ответ #4 : Ноябрь 03, 2011, 00:33 »

А если сто раз в цикле создать и удалить? Что с памятью будет?
Что сделать, дестрой?
Записан
andrew.k
Гуру общения
******
Offline Offline

Сообщений: 1567


*ерес - местный сумасшедший


Просмотр профиля
« Ответ #5 : Ноябрь 03, 2011, 00:38 »

ну да.
Код
C++ (Qt)
for ( int i = 0; i < 100; i++ )
{
 obj = new Object();
 delete obj;
}

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

"Вообще он что должен делать мне неясно и вотому что можно сделать тоже не могу." (С) Верес
Ubuntu_linux
Гость
« Ответ #6 : Ноябрь 03, 2011, 09:40 »

ну да.
Код
C++ (Qt)
for ( int i = 0; i < 100; i++ )
{
 obj = new Object();
 delete obj;
}

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

Сообщений: 7595


W7 x64, Qt SDK 4.7.2, Руки v1.5


Просмотр профиля
« Ответ #7 : Ноябрь 03, 2011, 09:49 »

Ubuntu_linux - если это утечка, то и на паскале это будет утечкой, и будет таким же циклом выявляться.

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

"Мастер простых решений" Ɋt

чОрный список: Spark
Ubuntu_linux
Гость
« Ответ #8 : Ноябрь 04, 2011, 19:32 »

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


Записан
Ubuntu_linux
Гость
« Ответ #9 : Ноябрь 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
Записан
Ubuntu_linux
Гость
« Ответ #10 : Ноябрь 07, 2011, 03:22 »

Так как бить с памятью?
Записан
Bepec
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 7595


W7 x64, Qt SDK 4.7.2, Руки v1.5


Просмотр профиля
« Ответ #11 : Январь 26, 2012, 19:15 »

Уже написали, делай блин цикл, ленивец антарктический, на qml.
И за пару минут выяснишь, это фича или утечка.
Записан

"Мастер простых решений" Ɋt

чОрный список: Spark
Ubuntu_linux
Гость
« Ответ #12 : Январь 26, 2012, 23:07 »

Но иногда надо четко удалить обект и создать заново. И как тогда сделать?
Записан
Bepec
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 7595


W7 x64, Qt SDK 4.7.2, Руки v1.5


Просмотр профиля
« Ответ #13 : Январь 27, 2012, 06:54 »

Сначала сделай цикл и выясни. Если память утекать не будет, значит то фича такая, а не утечка.

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

"Мастер простых решений" Ɋt

чОрный список: Spark
OKTA
Житель матрицы
******
Offline Offline

Сообщений: 1223



Просмотр профиля
« Ответ #14 : Январь 27, 2012, 07:19 »

Не надо бояться того, что qml не освобождает память мгновенно. У него свои механизмы по освобождению памяти - он ее освободит, но потом, когда точно память уже точно не понадобится))) Такие "утечки" происходят даже, если в ListView с ListModel добавлять новые айтемы тектстовые и тут же их удалять! Память будет забиваться, но! До определенного момента! МОжете проверить - выше какого-то значения она не поползет. Не могу сказать до какого и почему, но факт остается фактом))
Записан

When in doubt, use brute force - Ken Thompson
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.111 секунд. Запросов: 22.