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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 4.1 - утечка памяти в QToolBar ?  (Прочитано 6839 раз)
ElderOrb
Гость
« : Январь 06, 2006, 11:15 »

Если написать следующий кусок кода

Код:

QToolBar* fileToolBar = new QToolBar;
for(;;) {
fileToolBar->addSeparator();
fileToolBar->clear();
QApplication::processEvents();
}


... запустить, и смотреть в это время на task manager - можно увидеть как огромными шматками утекает память.. Может эт я чего не правильно делаю?

p.s. С менюшками такого не наблюдается..
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Январь 10, 2006, 11:04 »

а шо за fileToolBar?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
zlatko
Гость
« Ответ #2 : Январь 10, 2006, 13:05 »

наверно дело в цыкле
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Январь 10, 2006, 13:08 »

а кутя какая?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ElderOrb
Гость
« Ответ #4 : Январь 10, 2006, 13:14 »

2zlatko: Дело в утечке. Цикл я сделал только чтобы это было очевидно в таск манагере.

2Racheengel: Qt 4.1.0
Записан
Steven_Orko
Гость
« Ответ #5 : Январь 10, 2006, 17:12 »

В Qt написано:
void QToolBar::clear ()
Removes all actions from the toolbar.
See also removeAction().

Насколько я понимаю, дело не в утечке, а в том, что становится дофига сеператоров. Separator - это не Action
Записан
SLiDER
Гость
« Ответ #6 : Январь 10, 2006, 17:52 »

Цитата: "Steven_Orko"
Separator - это не Action


Именно так.  Крутой
Записан
Anchorite
Гость
« Ответ #7 : Январь 10, 2006, 21:43 »

А вот и не так. Смотрим файл src\gui\widgets\qtoolbar.cpp и видим:

Код:

QAction *QToolBar::addSeparator()
{
    QAction *action = new QAction(this);
    action->setSeparator(true);
    addAction(action);
    return action;
}
Записан
SLiDER
Гость
« Ответ #8 : Январь 10, 2006, 22:59 »

Цитата: "Anchorite"
А вот и не так. Смотрим файл src\gui\widgets\qtoolbar.cpp и видим:

Код:

QAction *QToolBar::addSeparator()
{
    QAction *action = new QAction(this);
    action->setSeparator(true);
    addAction(action);
    return action;
}


Гммммм. А ведь действительно.  :?  Непонятно.  :roll: Тогда почему следующий код из того же файла, не выполняет своих бязяностей (по свидетельству господина ElderOrb, сам не проверял еще)
Код:
void QToolBar::clear()
{
    QList<QAction *> actions = this->actions();
    for(int i = 0; i < actions.size(); i++)
        removeAction(actions.at(i));
}

Похоже нужно подебажить, но это уже завтра на работе. А сейчас пошол ка я спать, утро вечера мудреннее.
Записан
Steven_Orko
Гость
« Ответ #9 : Январь 10, 2006, 23:13 »

Ну, в общем-то он выполняет, только как -то по особенному. Количество элементов в списке становится ноль. Я сначала думал, что это проблемма в QList, но он нормально работает. Скорее всего, где-то неверно предается та область памяти, что занял QList, т.е. она просто копируется, вместо того, чтобы передаваться по ссылки на нее. Удаляются элементы в новом списке, а потом указатель на старую память теряется и место занимает новый.  Я немного подебажил код и вот это получилось. Будет время еще посмотрю. Но это действительно баг Qt, похоже...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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