Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Ground от Январь 03, 2012, 16:40



Название: Утечка памяти при добавлении текста в QTextEdit
Отправлено: Ground от Январь 03, 2012, 16:40
Доброго времени суток! Натолкнулся на очень неприятный баг, при выполнении вот такого кода - жутко течет память:
Код
C++ (Qt)
qint8 MainWindow::slotAddTextToLog(const QString text)
{
   teLog->append(QDate::currentDate().toString("dd.MM.yyyy") +
" " +
                 QTime::currentTime().toString() + " - " + text);
 
return 0;
}
Другими словами, банальная операция. Вызывается сигналом, иногда достаточно регулярно. На каждый вызов куда-то пропадает страничка памяти.
Если закомментировать - проблем нет. Баг, или так и должно быть?


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: vertus от Январь 03, 2012, 22:54
Не должно быть.
teLog->append - надо смотреть здесь что происходит.


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: JamS007 от Январь 04, 2012, 00:30
В коде используются только Qt-шные функции, так что, если Вы уверенны в утечке, возможно действительно баг. Попробуйте поочередно закомментировать вызов каждой из статических функций, а потом закоментируйте обе и вызовите append(). Так Вы по крайней мере сможете исключить функции которые не подтекают и найти ту, которая генерирует лик.


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: Ground от Январь 04, 2012, 03:42
Да я уже потом проверил вот такой код:
Код
C++ (Qt)
teLog->append(QString("Test\r\n"));
И действительно утекает, гораздо больше, чем при обычном сохранении этой фразы в QTextEdit. Т.е. за 1000 вызовов уходит примерно 1Мб.
Вот такой код работает нормально, но очень медленно. Тут память возрастает лишь на то значение, что соизмеримо сохранению фразы в памяти:
Код
C++ (Qt)
teLog->setText(teLog->toHtml() + QString("Test\r\n"));
Я просто думал, что может не понимаю каких-нибудь скрытых механизмов в append(), но видимо и правда баг.


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: kambala от Январь 04, 2012, 05:07
а версия какая?


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: Ground от Январь 04, 2012, 05:15
а версия какая?
4.8 RC, ставил вот недавно - неделю назад.
Ранее я тоже сталкивался с необъяснимыми утечками (предыдущая версия этого же приложения), а там была версия Qt 4.7.4. Я тогда их долго искал по всему коду и даже не думал append().
ОС: Win 7, х86

PS: прикрепляю тестовый проект, 5к раз вызывается функция, утекает 3-4Мб.
Даже если банально посчитать, выводятся слова: "Test 0000\r\n", это 44 байта (если по 4 байта на символ), 214Кб за 5к повторений. Ну никак не 3Мб.


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: Bepec от Январь 04, 2012, 10:41
Умный человек мне рассказал одну великую вещь. В QTextEdit, на каждый символ отводится ещё память под его формат/цвет/особые характеристики/цвет фона.

В результате каждый байт текста умножается на количество его параметров, и в любом случае, память начинает заполняться (а не утекать).

Объясню проще:

При записи append'om - вместе с текстом хранится ещё куча информации по нему.

При записи HTML - записывается только текст, который в дальнейшем пропускается через компилятор HTML. И соответственно с каждой строчкой, быстродействие снижается.

PS но чтобы добиться похожего быстродействия, как при append, мне пришлось потратить 2 дня на текстовый model-view :)


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: LisandreL от Январь 04, 2012, 11:02
Прежде всего добавьте возможность (по кнопке например) стирания этого teLog'а. Если при удалении текста память освобождается, то об утечке говорить нельзя (только о нецелевом использовании  ;) ).


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: Igors от Январь 04, 2012, 11:13
PS: прикрепляю тестовый проект, 5к раз вызывается функция, утекает 3-4Мб.
Даже если банально посчитать, выводятся слова: "Test 0000\r\n", это 44 байта (если по 4 байта на символ), 214Кб за 5к повторений. Ну никак не 3Мб.
Я проверил инструментами ("Leaks", OSX). Никаких утечек нет, все освобождается корректно. Просто реализация "жирная". Каждый раз когда Вы добавляете (якобы) строку - в действительности это "параграф", а он тянет массу всего (QTextLayout, QFont, QMutex) - и все это весит куда больше чем маленькая строка  


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: Ground от Январь 04, 2012, 12:53
Всем спасибо, что помогли разобраться!

Я проверил инструментами ("Leaks", OSX). Никаких утечек нет, все освобождается корректно. Просто реализация "жирная". Каждый раз когда Вы добавляете (якобы) строку - в действительности это "параграф", а он тянет массу всего (QTextLayout, QFont, QMutex) - и все это весит куда больше чем маленькая строка 
А не могли бы вы поточнее назвать, что за инструментами вы пользовались для отслеживания утечек (желательно не только памяти, но и дескрипторов и всего прочего)?


Название: Re: Утечка памяти при добавлении текста в QTextEdit
Отправлено: kambala от Январь 04, 2012, 13:14
программа так и называется - Instruments, а в ней есть модуль Leaks. доступна только для Mac OS X в составе средств разработчика.