Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Noise от Август 25, 2009, 09:18



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


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Rcus от Август 25, 2009, 09:24
эээ... /** с недоверием относится к заявлениям об утечках памяти без трейсов */
Ну найти источник проблемы, сравнить с кодом новых версий библиотеки и принять решение об обновлении... Я обычно так делаю когда встречаю проблемы в библиотеках.


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


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Latiol от Август 25, 2009, 14:03
У меня была такая же проблема. Вариант использовать какой-нибудь другой компонент для отображения информации.


Название: Re: QLabel в методе текст утечка памяти
Отправлено: zenden от Август 25, 2009, 14:42
Вероятно дело в способе, которым вы меряете память.

Вот здесь (http://lists.trolltech.com/qt-interest/2000-11/thread00767-0.html) есть размышления на этот счёт, датируется аж 2000 годом, так что  если бы утечка действительно была, её давно бы исправили.


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Alex Custov от Август 25, 2009, 15:00
При вызове метода ui.labelSizeQueue->setText(str); происходит утечка памяти. Если строчку закоментить то утечка пропадает! Версия QT 4.2
void LogServer::setSizeQueue(QString &str)
{
   ui.labelSizeQueue->setText(str);
}
Как можно решить эту проблему?

Данные, заносимые через setText(), очевидно копируются во внутренние структуры QLabel (см. исходники), из-за чего потребление памяти естественно увеличится. Говорить об утечке можно только если при многократном вызове setText() объём используемой памяти постоянно увеличивается.


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


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Noise от Август 27, 2009, 17:03
да забыл сказать использование QlineEdit вместо QLabel решило проблему, но мне всё равно хотелось бы решить проблему что бы можно было использовать и QLabel!


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Rcus от Август 27, 2009, 17:35
Что-то мне лень искать исходники Qt 4.2 и писать тест. А кому не лень? :)


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Igors от Август 27, 2009, 18:55
Объем памяти увеличивается за 10000 раз вызова на 500кб!
Но когда создаю простейший тест то изменение ни как в объеме занимаемой программы не происходит!
А когда в своей программе  оставляю такой код
void LogServer::setSizeQueue(QString &str)
{
   ui.labelSizeQueue->setText(str);
}
то объем постоянно увеличивается. А если такой
void LogServer::setSizeQueue(QString &str)
{}
то увеличение объема прекращается!
"Нет этой строки - нет утечки" еще не доказывает что эта строка является ее причиной/виновником  setText слишком популярен чтобы такая проблема оставалась незамеченной (даже в версии 1.0). Гораздо более вероятно что приходит испорченный str который не может быть корректно скопирован. Где и как он портится - никто не знает и без тестового проекта - не узнает никогда  :)
 


Название: Re: QLabel в методе текст утечка памяти
Отправлено: lit-uriy от Август 27, 2009, 19:14
>>А кому не лень?
Дык, пусть автор и попробует собрать свою программу с другой Qt, ради эксперимента.


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

А строка формируется так string.setNum(size, 10); и потом вызывается метод setSizeQueue   :-\


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Igors от Август 27, 2009, 19:59
Имеет смысл заменить ui.labelSizeQueue на какую-нибудь постороннюю/чистую QLabel, можно static. И посмотреть что будет. Потом (если не поможет) слить все строки в файл (или лог) и посмотреть что то за строки. Потом еще что-то придумается  :)


Название: Re: QLabel в методе текст утечка памяти
Отправлено: alex12 от Сентябрь 01, 2009, 23:14
Наблюдаю те же симптомы!

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

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

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

Похоже, что ситуация наблюдается только на MinGW. На Linux-е утечки нет.


Название: Re: QLabel в методе текст утечка памяти
Отправлено: Latiol от Сентябрь 09, 2009, 03:32
Я у себя заметил, что если я кидаю QLabel в StatusBar, то утечки нет.


Название: Re: QLabel в методе текст утечка памяти
Отправлено: shadone от Сентябрь 09, 2009, 14:31
4.2, серьезно? :-\
обновитесь до Qt 4.5.3