Название: Утечка памяти при добавлении текста в QTextEdit Отправлено: Ground от Январь 03, 2012, 16:40 Доброго времени суток! Натолкнулся на очень неприятный баг, при выполнении вот такого кода - жутко течет память:
Код Другими словами, банальная операция. Вызывается сигналом, иногда достаточно регулярно. На каждый вызов куда-то пропадает страничка памяти. Если закомментировать - проблем нет. Баг, или так и должно быть? Название: 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 Да я уже потом проверил вот такой код:
Код И действительно утекает, гораздо больше, чем при обычном сохранении этой фразы в QTextEdit. Т.е. за 1000 вызовов уходит примерно 1Мб. Вот такой код работает нормально, но очень медленно. Тут память возрастает лишь на то значение, что соизмеримо сохранению фразы в памяти: Код Я просто думал, что может не понимаю каких-нибудь скрытых механизмов в 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Мб. Я проверил инструментами ("Leaks", OSX). Никаких утечек нет, все освобождается корректно. Просто реализация "жирная". Каждый раз когда Вы добавляете (якобы) строку - в действительности это "параграф", а он тянет массу всего (QTextLayout, QFont, QMutex) - и все это весит куда больше чем маленькая строка Даже если банально посчитать, выводятся слова: "Test 0000\r\n", это 44 байта (если по 4 байта на символ), 214Кб за 5к повторений. Ну никак не 3Мб. Название: Re: Утечка памяти при добавлении текста в QTextEdit Отправлено: Ground от Январь 04, 2012, 12:53 Всем спасибо, что помогли разобраться!
Я проверил инструментами ("Leaks", OSX). Никаких утечек нет, все освобождается корректно. Просто реализация "жирная". Каждый раз когда Вы добавляете (якобы) строку - в действительности это "параграф", а он тянет массу всего (QTextLayout, QFont, QMutex) - и все это весит куда больше чем маленькая строка А не могли бы вы поточнее назвать, что за инструментами вы пользовались для отслеживания утечек (желательно не только памяти, но и дескрипторов и всего прочего)?Название: Re: Утечка памяти при добавлении текста в QTextEdit Отправлено: kambala от Январь 04, 2012, 13:14 программа так и называется - Instruments, а в ней есть модуль Leaks. доступна только для Mac OS X в составе средств разработчика.
|