реклама на сайте
подробности

 
 
> Делфи 5. Утечка памяти.
GetSmart
сообщение Jan 23 2012, 16:03
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Есть проект на Делфи 5. Работает сутки и более. В процессе работы вижу в диспетчере задач, что память процесса растёт на 100-200-300 МБ. За сутки может 300 отъесть. Но в алгоритме там реально памяти требуется всего 20-40 МБ. Однако там сотни тысяч-миллионы раз происходит работа со строками (от 1 до 100000 символов длиной). Это единственное подозрение на утечку.

Я правильно понимаю, что если я в процедуре создал строку, то на выходе из этой процедуры Делфа должна сама освобождать указатель строки? И аналогично, если я заполненной строке присваиваю новое значение, то делфа должна сама старую строку удалить из динамической памяти? Или это должен делать программист сам?

Сообщение отредактировал GetSmart - Jan 23 2012, 23:36


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Jan 25 2012, 02:31
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Почти нашёл косяк.
Переделывать под Делфи 7 я так и не решился, т.к. надо изучать новый компонент и отлаживаться на нём.


Сделал как ранее предлагал, вместо записи в Memo пишу в файл, вместо вызова GetMem(), заранее выделяю мегабайтный буфер и потом внутри него выдаю частями. Сделал обёртку GetMem() и FreeMem() для сбора статистики. В итоге обнаружилась своя утечка на ~50 МБ/сутки. Но не 300. Это было в поиске уникальных строк, шастая по быстрому дереву поиска, когда даже если строка полностью идентична, то создавались ненужные ветви дерева. Тогда как запланировано, что ветви дерева должны создаваться только для разделения уникальных строк. Короче, идя по дереву с новой строкой я зря создавал ветви "на лету", тогда как надо было сперва дойти до конца строки и только если она отлична, создавать. А 50 МБ превращалось в 300 уже наверно из-за фрагментации и постоянно увеличивающегося текста в Memo. По крайней мере, пока с моей утечкой 50 МБ и мегабайтными буферами не вижу доп.утечек.

Upd.
Даже не 50, а примерно 20. И не утечка, а незапланированная и бесполезная трата памяти. В итоге что-то её увеличило в 10 с лишним раз.

Сообщение отредактировал GetSmart - Jan 25 2012, 20:07


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 14:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016