crossplatform.ru

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

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


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

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

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




Репутация:   2  


Цитата(Litkevich Yuriy @ 9.8.2010, 0:55) *
после удаления элемента кол-во элементов в виджете станет на единицу меньше, а ты это не проверяешь.
вместо itemsCount надо всё время звать функцию, которая вернёт кол-во элементов в виджете

всё правильно, т.к. удаляется самый верхний элемент. количество итераций == начальному числу top level item`ом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_dreamcode_*_*
сообщение 9.8.2010, 0:39
Сообщение #12





Гости








    


Цитата(Litkevich Yuriy @ 8.8.2010, 23:55) *
после удаления элемента кол-во элементов в виджете станет на единицу меньше, а ты это не проверяешь.
вместо itemsCount надо всё время звать функцию, которая вернёт кол-во элементов в виджете



Когда я добавляю элемент тогда itemsCount++

itemsCount=количество элементов в виджете ,

И что ни кто не сталкивался с проблемой утечки в QTreeWidget ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 9.8.2010, 7:45
Сообщение #13


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

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

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




Репутация:   7  


Цитата
И что ни кто не сталкивался с проблемой утечки в QTreeWidget ???


Да нет никакой утечки! Расслабтесь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dreamcode
  опции профиля:
сообщение 9.8.2010, 8:07
Сообщение #14


Студент
*

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

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




Репутация:   0  


Цитата(kuzulis @ 9.8.2010, 7:45) *
Да нет никакой утечки! Расслабтесь!


Аргументируй тогда куда память девается !!!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.8.2010, 8:47
Сообщение #15


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


а вот такой код удаления, наверное, лучше
    for(;ui->treeWidget->topLevelItemCount();)
    {
        delete ui->treeWidget->topLevelItem(0);
    }


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 9.8.2010, 8:59
Сообщение #16


Студент
*

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

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




Репутация:   0  


Цитата(dreamcode @ 9.8.2010, 9:07) *
Аргументируй тогда куда память девается !!!!

блин, еще раз - диспетчер показывает ОБЩУЮ память приложения, когда-либо выделенную осью аппликухе. Удалив айтемы, память операционке ты не вернешь (да и не нужно это). В куче будет свободная память, которая может быть использована как повторно в тривьюхе, так и в других местах. Пример - создав строку размером 500 метров ты отожрешь 500 метров ОП и диспетчер этр покажет. Удалив строку, ты освободищь память в куче и создав такую же строку еще раз, память у ОС запрашиваться не будет (в диспетчере будет те же 500мб)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.8.2010, 9:21
Сообщение #17


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Можно потестировать вручную :)

//некая глобальная переменная
QList<QTreeWidgetItem*> m_ControlList;


...
{
   ...
   QTreeWidgetItem* item = new QTreeWidgetItem(0);
   m_ControlList.append(item);
}


Затем, после удаления, зайти отладчиком и попробовать доступ к каждому из элементов
    for(;ui->treeWidget->topLevelItemCount();)
    {
        delete ui->treeWidget->topLevelItem(0);
    }
    
    for(int i=0;i<m_ControlList.size();i++)
    {
        try
        {
            m_ControlList[i]->parent();
        }
        catch(...)
        {
            //память недоступна
            int iii=1;
        }
    }


в консоли приложения при попытке обращения пишут
(Internal error: pc 0x201 in read in psymtab, but not in symtab.)
(хотя исключение не летит, хм, прикольно. В студии вылетает с треском :D )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 9.8.2010, 11:27
Сообщение #18


Студент
*

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

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




Репутация:   0  


Цитата(Алексей1153 @ 9.8.2010, 10:21) *
Можно потестировать вручную :)

//некая глобальная переменная
QList<QTreeWidgetItem*> m_ControlList;


...
{
   ...
   QTreeWidgetItem* item = new QTreeWidgetItem(0);
   m_ControlList.append(item);
}


Затем, после удаления, зайти отладчиком и попробовать доступ к каждому из элементов
    for(;ui->treeWidget->topLevelItemCount();)
    {
        delete ui->treeWidget->topLevelItem(0);
    }
    
    for(int i=0;i<m_ControlList.size();i++)
    {
        try
        {
            m_ControlList[i]->parent();
        }
        catch(...)
        {
            //память недоступна
            int iii=1;
        }
    }


в консоли приложения при попытке обращения пишут
(Internal error: pc 0x201 in read in psymtab, but not in symtab.)
(хотя исключение не летит, хм, прикольно. В студии вылетает с треском :D )


в с++ SIGSEGV не выкидывает искючений
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.8.2010, 12:00
Сообщение #19


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Авварон, у меня в креаторе тоже не выпало, но надпись в консоли красным цветом появилась всё же
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 9.8.2010, 12:20
Сообщение #20


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(Алексей1153)
у меня в креаторе тоже не выпало, но надпись в консоли красным цветом появилась всё же
Красную надпись объяснить легко
inline const T &QList<T>::operator[](int i) const
{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::operator[]", "index out of range");
return reinterpret_cast<Node *>(p.at(i))->t(); }

К сожалению (а может и к счастью) ошибка сегментации, так же как и деление на ноль, не являются исключениями с++ и через try/catch ты их не отловишь.

Цитата(Алексей1153)
    for(;ui->treeWidget->topLevelItemCount();)
    {
        delete ui->treeWidget->topLevelItem(0);
    }
Тогда уж так
while (ui->treeWidget->topLevelItemCount())
    delete ui->treeWidget->topLevelItem(0);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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