![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| uwannadie |
|
||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
заполняю VirtualStringTree данными, имеющими следующую структуру
Заполняется дерево следующим образом
в событии OnFreeNode написано следующее:
вопрос: почему при удалении всех узлов дерева, последующем выполнение
и заполнении дерева аналогичными данными объем занимаемой памяти увеличивается. при этом FastMM ругается на утечки памяти:
--------------------
|
||||||||||
|
|||||||||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Хм, наугад - утечки UnicodeString, а поля в записи типа String. Какая версия Делфи? Может это утечки и не в дереве?
Ну и можно попробовать освобождать память, вручную затирая строки:
|
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
пробовал, перед тем, как создавать тему. не помогает
RAD Studio 2010 Architect Это сообщение отредактировал(а) uwannadie - 4.4.2010, 16:27 --------------------
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Из лога FastMM приведен только конец. Самое интересное - в нем фигурирует TstringList, а в приведенном коде его не наблюдается. Смотри по полному логу, где он (TStringList) создается и уничтожается.
|
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
при всем этом программа обрабатывает данные без сучка и задоринки, но если раз 10-12 очистить и заполнить дерево аналогичными данными, то размер программы в оперативке легко возрастает до 50-60 мб
--------------------
|
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Так может все-таки дело действительно не в записях дерева, если ручное затирание не помогает?
Может попробовать не очищать узлы в дереве и посмотреть добавятся в этом случае новые утечки или нет? По идее должны, хотя как работают новые версии Делфи я не знаю, знаком только с Д7. Если добавятся, то это уже точно будут из дерева, и следовательно нынешние вызваны чем-то другим. |
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
стринглист освобождается в другом месте. в нем находится список http ссылок (а-ля зеркал обновления). --------------------
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
| uwannadie |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
вот создание данного списка
вот освобождение памяти
--------------------
|
||||
|
|||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
у меня в программе он единственный (по-крайней мере я больше не создавал)
--------------------
|
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
В целом немного необычно, когда глобальнае переменная создается по одной кнопке и уничтожается по другой. Обычно я например ставлю это в процедуры создания/удаления формы. А в теле процедур использую Clear. Ведь если кнопка сохранить (вторая процедура) нажата не будет, то список не очистится. А при повторном вызове первой процедуры, возникнет утечка памяти.
|
|||
|
||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Читай, пожалуйста, сообщения полностью. В частности:
Если в логе идут только адреса, то нужно включить в опциях проекта Debug information и include TD32 debug Info. В D7 первая находится в закладке Compiler а вторая на закладке Linker. После этого сделать Build проекту, удалить старый лог и запустить программу для генерации нового. Добавлено через 1 минуту и 7 секунд +много необычно |
||||
|
|||||
| uwannadie |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
нашел, на что ругается FastMM
есть у меня процедура, в которой содержимое дерева сохраняется в список (какашками не кидаться за индуский код, т.к. это пре альфа-альфа-альфа версия программы)
ругается везде на:
остальные утечки, судя по номерам строк, завязаны на реализации механизма поиска файлов в делфи --------------------
|
||||
|
|||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Отлично. Теперь осталось корректно освободить память от NodeList. После этого какие-то утечки еще остаются?
|
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
память освобождается, но вне процедуры:
--------------------
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Это всё, что Вас просили показать?
Удачи Вам. |
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
последовал совету Dom, вынеся создание стриглистов в событие OnCreate формы а освобождение памяти в событие OnClose. в итоге остались лишь проблемы с памятью, связанные с тем, что RAD studio видимо все переменные типа String приводит к UnicodeString для поддержки юникода.
kami,Dom - спасибо за Ваше время и Ваши нервы, потраченные на решение проблемы. Добавлено @ 19:12 вот нашел обьяснение утечкам памяти:
© http://www.citforum.ru/programming/delphi/unicode/1.shtml Это сообщение отредактировал(а) uwannadie - 4.4.2010, 19:14 --------------------
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Т.е. FastMM продолжает выдавать утечки? В таком случае - проблема решена не полностью. В отлаженном приложении утечек быть не будет. Исключение я знаю только одно - в 9-й версии Indy была проблема с не-высвобождением чего-то из "внутренностей". При использовании стандартных компонент (VT можно отнести к ним) утечек быть не должно. Если есть - проблема в своем коде. Лог после исправления части утечек в студию, пожалуйста. |
|||
|
||||
| uwannadie |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
ругается постоянно на 2 строчки в процедуре
еще ругается на 1 строчку в модуле с реализацией потока
прикрепил лог работы Присоединённый файл ( Кол-во скачиваний: 4 )
UpdateManager_MemoryManager_EventLog.rar 43,17 Kb--------------------
|
||||
|
|||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
В OnFreeNode вместо Finalize(FileData^) поставьте Dispose(FileData). по результатам будем смотреть дальше, но Finalize не предназначено для корректного высвобождения строк.
|
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
пробовал уже давно, вылезает "Exception: Invalid Pointer Operation"
--------------------
|
|||
|
||||
| kami |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Понятно, ведь New не было вызвано, а они работают только в связке... Сделайте так (в FillTreeviewWithFiles), Dispose оставьте на месте:
Это сообщение отредактировал(а) kami - 4.4.2010, 20:20 |
||||
|
|||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
все равно вылетает исключение
--------------------
|
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Немного не по теме
Почему, или это исключительно для UnicodeString? В хелпе Д7 написано:
Сам использую эту процедуру, для AnsiString работает корректно, память освобождается, никаких утечек. |
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
А теперь по теме.
Может дело все же не в освобождении памяти из-под записей в дереве, если ручное "затирание" строк не устраняет утечек? |
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
надо еще будет попробовать откомпилить и протестировать в других версиях делфи/бдс, может в компиляторе дело
--------------------
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
По теме и не по теме:
Dom, согласен, туплю. (по поводу высвобождения строк). uwannadie, Dom, Дело действительно не в бобине В итоге - проблема в связках FindFirst>FindNext>FindClose процедуры FillTreeviewWithFiles. Если говорить точнее - то при окончании цикла по директориям не вызывался FindClose, а сразу шел FindFirst по файлам. Ну и + FindClose должен вызываться не всегда, а при успешном вызове FindFirst (гы, справка рулит UPD: то ли лыжи не едут, то ли не пойму - утечки опять появились. Сейчас будем править... Это сообщение отредактировал(а) kami - 4.4.2010, 21:54 |
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Опять же получается "не по теме".
Вот тоже собрал тестовый проект, но по другому случаю - на посмотреть как освобождаются данные из узлов. Получил неожиданный результат. Процедура OnFreeNode вызывается только для тех узлов, которые были видны на форме. И следовательно память из-под узлов которые не были видимы не освобождается. Если прокрутить список узлов до конца, то при вызове Clear освобождаются все узлы, и никаких утечек нет. Э-э-э, в чем подвох? Могу приложить тестовый проект, если требуется. |
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Ага, заглянул в исходники. Чтобы вызвалась OnFreeNode должно выполнится условие
Но при создании не все узлы получают vsInitialized. А вот если после добавления всех узлов вызвать FullExpand, то память освобождается корректно без каких-либо дополнительных манипуляций. Т.е. инициализация происходит для всех узлов в этом случае. |
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
эх, а я то думал, что у меня индусский код...
пойду шаманить дальше... --------------------
|
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Попробуй FullExpand вызвать для дерева, и потом сделай Clear. При этом дерево должно память освободить. И связанных с этим утечек памяти не будет.
Это конечно не очень красиво, но пока не пойму как иначе сделать. |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Dom, точно!
Утечек =0, проверено на папке C:\ |
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
kami, да, работать будет. Но мне кажется что в таком красивом компоненте инициализация должна делаться как-то изящнее. Смотрел исходники, так пока и не увидел где и в какой момент добавляется состояние vsInitialized добавленному узлу, который отображается, видимо где-то при попытке вывести содержимое узла на экран он и инициализируется. Но суть не в этом, вопрос в том как правильно инициализировать узел?
И кстати если уже решать проблему в лоб, то достаточно добавить vsInitialized, состояние vsInitialUserData используется немного для других целей. |
|||
|
||||
| uwannadie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 5.6.2009 Где: Крым, Керчь Репутация: нет Всего: 1 |
ну если не ошибаюсь, то в мануалах по VT написано, что дочерние элементы в дерево рекомендуется добавлять через события
OnInitChildren, а метод AddChild не рекомендуется использовать. Это сообщение отредактировал(а) uwannadie - 5.4.2010, 02:52 --------------------
|
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Точно! Тоже нашел про инициализацию и добавление узлов в дерево через RootNodeCount, OnInitNode, OnInitChildren. Красиво конечно.
Только тут могут возникнуть заморочки с динамическим добавлением данных в узел, т.е. в рассматриваемом случае надо генерировать записи на лету при первом обращении к узлу. Либо надо где-то хранить предварительно созданный и заполненный список/массив исходных записей, что уже само по себе не есть правильно, т.к. при инициализации придется копировать эти данные в дерево. Следовательно расход памяти возрастет. |
|||
|
||||
| Dom |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Вот процедура для ручной инициализации узла и если надо его наследников - ReinitNode.
Так что если нет желания переходить на OnInitNode и OnInitChildren, то после заполнения узлов по AddChild, надо пробежаться по ним всем и инициализировать этой процедурой. И тогда утечек не будет. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |