crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Утечка памяти QTreeWidget. Может баг QT ?
dreamcode
  опции профиля:
сообщение 8.8.2010, 19:08
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 2.11.2009
Пользователь №: 1201

Спасибо сказали: 1 раз(а)




Репутация:   0  


Люди вот два куска кода (вставка и удаление)
после того как добавить штук 300 элементов а потом их удалить то память не освобождается ...
Мож что то не то ??? помогите плис ...!!!!!

Вставка элементов :

 dir.setCurrent(path);

    QFileIconProvider iconP;
    QStringList list = dir.entryList(QDir::Dirs | QDir::Files,QDir::Type);

    for(int i=1;i<list.size();i++)
    {
       QTreeWidgetItem* item = new QTreeWidgetItem(0);
       item->setText(0,list.at(i));
       setWindowTitle(lPath);

       if(!(lPath.endsWith("\\")))
         item->setIcon(0,iconP.icon(QFileInfo(lPath+"\\"+list.at(i))));
       else
           item->setIcon(0,iconP.icon(QFileInfo(lPath+list.at(i))));

       ui->treeWidget->addTopLevelItem(item);

       itemsCount++;
    }




И код удаления :

for(int i=0;i<itemsCount;i++)
        delete (ui->treeWidget->takeTopLevelItem(0));
     itemsCount=0;

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.8.2010, 19:19
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(dreamcode @ 8.8.2010, 20:08) *
после того как добавить штук 300 элементов а потом их удалить то память не освобождается ...

А чем проверяешь, что память не освобождается?
Не в диспетчере-ли задач смотришь? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dreamcode
  опции профиля:
сообщение 8.8.2010, 19:23
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 2.11.2009
Пользователь №: 1201

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(BRE @ 8.8.2010, 19:19) *
Не в диспетчере-ли задач смотришь?


Смотрел и в диспетчере и в прогах типа ProcessInfo
Везде один результат...


А что не так с диспетчером задач то ????
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.8.2010, 19:32
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(dreamcode @ 8.8.2010, 20:23) *
Цитата(BRE @ 8.8.2010, 19:19) *
Не в диспетчере-ли задач смотришь?


Смотрел и в диспетчере и в прогах типа ProcessInfo
Везде один результат...


А что не так с диспетчером задач то ????

Он показывает не ту память, которую ты пытаешься контролировать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dreamcode
  опции профиля:
сообщение 8.8.2010, 19:34
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 2.11.2009
Пользователь №: 1201

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ну размер памяти которую прога жрет возрастает при добавлении .... А при удалении не уменьшается..
Если пару разков так прокрутить то из 5МБ памяти можно получить целых 17МБ...

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.8.2010, 19:41
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(dreamcode @ 8.8.2010, 20:34) *
Ну размер памяти которую прога жрет возрастает при добавлении .... А при удалении не уменьшается..
Если пару разков так прокрутить то из 5МБ памяти можно получить целых 17МБ...

Память растет, потому что процесс запрашивает ее у ОС для своего хипа (кучи), но после освобождения памяти в хипе она не обязательно отдается системе обратно, а продолжает использоваться для аллокации внутри процесса. Поэтому, по диспетчеру и не видно ее освобождение.
В общем, диспетчер плохой инструмент для отлова утечек памяти внутри процесса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dreamcode
  опции профиля:
сообщение 8.8.2010, 20:06
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 2.11.2009
Пользователь №: 1201

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(BRE @ 8.8.2010, 19:41) *
но после освобождения памяти в хипе она не обязательно отдается системе обратно, а продолжает использоваться для аллокации внутри процесса.




А что тогда делать в моем случае....???? можно ведь и до 100,200,300 МБ до работаться..... Ну ведь я же все освободил то оно мне уже не нада....


А чем тогда тестить утечки памяти ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.8.2010, 20:26
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(dreamcode @ 8.8.2010, 21:06) *
А что тогда делать в моем случае....???? можно ведь и до 100,200,300 МБ до работаться..... Ну ведь я же все освободил то оно мне уже не нада....
А чем тогда тестить утечки памяти ???

Для linux есть хороший инструмент valgrind.
Для венды не скажу, но если ты поищешь по форуму здесь и на prog.org.ru, то найдешь ответ (помню были подобные обсуждения).

Насчет утечки, а если выполнить твой код 10, 20, 50 раз, память будет расти?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 8.8.2010, 20:28
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


бывают баги в Qt и valgrind их показывает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.8.2010, 23:55
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(dreamcode @ 8.8.2010, 23:08) *
for(int i=0;i<itemsCount;i++)
delete (ui->treeWidget->takeTopLevelItem(0));
itemsCount=0;
после удаления элемента кол-во элементов в виджете станет на единицу меньше, а ты это не проверяешь.
вместо itemsCount надо всё время звать функцию, которая вернёт кол-во элементов в виджете
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.9.2018, 18:09