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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QLabel в методе текст утечка памяти  (Прочитано 9576 раз)
Noise
Гость
« : Август 25, 2009, 09:18 »

При вызове метода ui.labelSizeQueue->setText(str); происходит утечка памяти. Если строчку закоментить то утечка пропадает! Версия QT 4.2
void LogServer::setSizeQueue(QString &str)
{
   ui.labelSizeQueue->setText(str);
}
Как можно решить эту проблему?
Записан
Rcus
Гость
« Ответ #1 : Август 25, 2009, 09:24 »

эээ... /** с недоверием относится к заявлениям об утечках памяти без трейсов */
Ну найти источник проблемы, сравнить с кодом новых версий библиотеки и принять решение об обновлении... Я обычно так делаю когда встречаю проблемы в библиотеках.
Записан
spectre71
Гость
« Ответ #2 : Август 25, 2009, 09:37 »

При вызове метода ui.labelSizeQueue->setText(str); происходит утечка памяти. Если строчку закоментить то утечка пропадает! Версия QT 4.2
void LogServer::setSizeQueue(QString &str)
{
   ui.labelSizeQueue->setText(str);
}
Как можно решить эту проблему?
Не верю.
Сделай простейший тест и выложи сюда.
Записан
Latiol
Гость
« Ответ #3 : Август 25, 2009, 14:03 »

У меня была такая же проблема. Вариант использовать какой-нибудь другой компонент для отображения информации.
Записан
zenden
Гость
« Ответ #4 : Август 25, 2009, 14:42 »

Вероятно дело в способе, которым вы меряете память.

Вот здесь есть размышления на этот счёт, датируется аж 2000 годом, так что  если бы утечка действительно была, её давно бы исправили.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Август 25, 2009, 15:00 »

При вызове метода ui.labelSizeQueue->setText(str); происходит утечка памяти. Если строчку закоментить то утечка пропадает! Версия QT 4.2
void LogServer::setSizeQueue(QString &str)
{
   ui.labelSizeQueue->setText(str);
}
Как можно решить эту проблему?

Данные, заносимые через setText(), очевидно копируются во внутренние структуры QLabel (см. исходники), из-за чего потребление памяти естественно увеличится. Говорить об утечке можно только если при многократном вызове setText() объём используемой памяти постоянно увеличивается.
Записан
Noise
Гость
« Ответ #6 : Август 27, 2009, 16:42 »

Объем памяти увеличивается за 10000 раз вызова на 500кб!
Но когда создаю простейший тест то изменение ни как в объеме занимаемой программы не происходит!
А когда в своей программе  оставляю такой код
void LogServer::setSizeQueue(QString &str)
{
   ui.labelSizeQueue->setText(str);
}
то объем постоянно увеличивается. А если такой
void LogServer::setSizeQueue(QString &str)
{}
то увеличение объема прекращается!
Записан
Noise
Гость
« Ответ #7 : Август 27, 2009, 17:03 »

да забыл сказать использование QlineEdit вместо QLabel решило проблему, но мне всё равно хотелось бы решить проблему что бы можно было использовать и QLabel!
Записан
Rcus
Гость
« Ответ #8 : Август 27, 2009, 17:35 »

Что-то мне лень искать исходники Qt 4.2 и писать тест. А кому не лень? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 27, 2009, 18:55 »

Объем памяти увеличивается за 10000 раз вызова на 500кб!
Но когда создаю простейший тест то изменение ни как в объеме занимаемой программы не происходит!
А когда в своей программе  оставляю такой код
void LogServer::setSizeQueue(QString &str)
{
   ui.labelSizeQueue->setText(str);
}
то объем постоянно увеличивается. А если такой
void LogServer::setSizeQueue(QString &str)
{}
то увеличение объема прекращается!
"Нет этой строки - нет утечки" еще не доказывает что эта строка является ее причиной/виновником  setText слишком популярен чтобы такая проблема оставалась незамеченной (даже в версии 1.0). Гораздо более вероятно что приходит испорченный str который не может быть корректно скопирован. Где и как он портится - никто не знает и без тестового проекта - не узнает никогда  Улыбающийся
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Август 27, 2009, 19:14 »

>>А кому не лень?
Дык, пусть автор и попробует собрать свою программу с другой Qt, ради эксперимента.
Записан

Юра.
Noise
Гость
« Ответ #11 : Август 27, 2009, 19:38 »

Igors спасибо на вел на мысль в чем ещё может быть проблема :-)! Но всё же почему тогда не возникает таже проблема при использовании QlineEdit?
P.S. Автор делал несколько тестов и объем памяти там не увеличивался!

А строка формируется так string.setNum(size, 10); и потом вызывается метод setSizeQueue   В замешательстве
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Август 27, 2009, 19:59 »

Имеет смысл заменить ui.labelSizeQueue на какую-нибудь постороннюю/чистую QLabel, можно static. И посмотреть что будет. Потом (если не поможет) слить все строки в файл (или лог) и посмотреть что то за строки. Потом еще что-то придумается  Улыбающийся
Записан
alex12
Гость
« Ответ #13 : Сентябрь 01, 2009, 23:14 »

Наблюдаю те же симптомы!

Память начинает медленно утекать при использовании QLabel::setText( const QString &str ).

Проблема более сложная и неоднозначная, чем просто утечка в setText(). Очевидно, что здесь проявляется какая-то хитрая ситуация, при которой setText() приводит к утечке косвенно. Утечка возникает только при одном из режимов работы моей программы, в котором активно используются QByteArray и прочие контейнеры. В Process Explorer-е видно, что память постоянно прыгает плюс/минус 100 кБ, но при этом медленно растет.

Написать простой тест с утечкой у меня пока не получается. Инструментальные средства (Valgrind) пока ситуацию не проясняют. Буду копать дальше.

Похоже, что ситуация наблюдается только на MinGW. На Linux-е утечки нет.
« Последнее редактирование: Сентябрь 02, 2009, 00:50 от alex12 » Записан
Latiol
Гость
« Ответ #14 : Сентябрь 09, 2009, 03:32 »

Я у себя заметил, что если я кидаю QLabel в StatusBar, то утечки нет.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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