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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти при добавлении текста в QTextEdit  (Прочитано 6272 раз)
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;
}
Другими словами, банальная операция. Вызывается сигналом, иногда достаточно регулярно. На каждый вызов куда-то пропадает страничка памяти.
Если закомментировать - проблем нет. Баг, или так и должно быть?
« Последнее редактирование: Январь 03, 2012, 16:47 от Ground » Записан
vertus
Гость
« Ответ #1 : Январь 03, 2012, 22:54 »

Не должно быть.
teLog->append - надо смотреть здесь что происходит.
« Последнее редактирование: Январь 03, 2012, 23:00 от vertus » Записан
JamS007
Гость
« Ответ #2 : Январь 04, 2012, 00:30 »

В коде используются только Qt-шные функции, так что, если Вы уверенны в утечке, возможно действительно баг. Попробуйте поочередно закомментировать вызов каждой из статических функций, а потом закоментируйте обе и вызовите append(). Так Вы по крайней мере сможете исключить функции которые не подтекают и найти ту, которая генерирует лик.
Записан
Ground
Гость
« Ответ #3 : Январь 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(), но видимо и правда баг.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Январь 04, 2012, 05:07 »

а версия какая?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ground
Гость
« Ответ #5 : Январь 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Мб.
« Последнее редактирование: Январь 04, 2012, 05:25 от Ground » Записан
Bepec
Гость
« Ответ #6 : Январь 04, 2012, 10:41 »

Умный человек мне рассказал одну великую вещь. В QTextEdit, на каждый символ отводится ещё память под его формат/цвет/особые характеристики/цвет фона.

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

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

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

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

PS но чтобы добиться похожего быстродействия, как при append, мне пришлось потратить 2 дня на текстовый model-view Улыбающийся
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


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

Прежде всего добавьте возможность (по кнопке например) стирания этого teLog'а. Если при удалении текста память освобождается, то об утечке говорить нельзя (только о нецелевом использовании  Подмигивающий ).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

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

Всем спасибо, что помогли разобраться!

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

Сообщений: 4744



Просмотр профиля WWW
« Ответ #10 : Январь 04, 2012, 13:14 »

программа так и называется - Instruments, а в ней есть модуль Leaks. доступна только для Mac OS X в составе средств разработчика.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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