Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Утечка памяти в delphi


dmitry ©   (2005-05-21 21:14:00) 

Привет всем! Немогу понять почему происходит утечка памяти и утечка памяти ли это вообще... Подскажите плиз...
Есть функция GetFileList которая возвращяет список файлов в директории...
Она вызывается по таймеру и следит тем самым что содержание директории изменилось...
Если посмотреть в списке процессов то видно что память занимаемая процессом постоянно растёт... Если закоментировать строку вызывающюю функцию то размер программы увеличивать перестаёт...

Подскажите почему это может происходить? И вообще когда делфи уничтожает екземпляры класса? После выхода из функции? И что происходит в строке запуска функции, происходит копирование или DncList просто получает адресс уже созданного екземпляра класса и где про ето почитать... Заранее спасибо за ответы...

Вызываеться таким образом (лишнее я выкинул):
procedure TFormShablon.TimerTestFolderTimer(Sender: TObject);
var  DncList:TStringList;

begin
    DncList:=GetFileList('c:\123','*.*');
end;

Сама функция:
Function GetFileList(dir:string='';mask:string='*.*';attr:integer=faAnyFile):TStringList;
var res:cardinal;s:tsearchrec;
begin
 result:=TStringList.Create;
 if dir='' then dir:=GetCurrentDir;
 res:=FindFirst(dir+'/'+mask,attr,s);
 while res=0 do begin
   result.Append(s.Name);
   res:=FindNext(s);
 end;
end;


Anatoly Podgoretsky   (2005-05-21 22:38:00) [1]

Поскольку код не приведен, то наверно есть еще куча утечек. Кроме того смущает такое ассинхронное удаление списка, это тоже явная потенциальная проблема.


Anatoly Podgoretsky   (2005-05-21 22:36:00) [2]

Никакого, это два независимых источника утечек.


dmitry   (2005-05-21 22:27:00) [3]

Огромное спасибо... Виноват был FindClose, после того как я его добавил DncList.Free начала нормально удалять экземпляр класса... Вот только я так и не понял какое это имеет отношение друг к другу как думаете?


Anatoly Podgoretsky   (2005-05-21 21:55:00) [4]

begin
  DncList.Free;
  DncList:=GetFileList('c:\123','*.*');
end;


begin...end   (2005-05-21 21:44:00) [5]

> dmitry   (21.05.05 21:14)

О причинах роста занимаемой памяти сказали в [1]. Каждый раз при вызове функции GetFileList создаётся экземпляр класса TStringList: result:=TStringList.Create, и, вероятно, после этого он нигде не освобождается.

Можно сделать так: создавать экземпляр один раз вне функции, и потом каждый раз передавать ссылку на него в подпрограмму:

procedure GetFileList(List: TStringList; ...);
var
 ...
begin
 List.Clear;
 { Далее -- весь прежний код функции, только без result:=TStringList.Create
   и с заменой result.Appendна List.Append}
 ...
end;


Затем создаём экземпляр один раз в нужном месте программы:

var
 DncList: TStringList;
begin
 DncList := TStringList.Create
end


и по таймеру вызываем подпрограмму:

GetFileList(DncList, ...)

Когда DncList станет ненужным, его можно будет уничтожить (тоже толкьо один раз ):

DncList.Free.

Ну и ещё: определять наличие изменений в каталоге, вызывая что-то по таймеру, несколько нерационально. Для этого есть API-функции.

> dmitry   (21.05.05 21:33) [2]

Добавьте в функцию вызов FindClose.


dmitry   (2005-05-21 21:33:00) [6]

Дак и яж про что... Даже если изменить процедуру как указано ниже всёравно нечего не меняеться как это исправить?

procedure TFormShablon.TimerTestFolderTimer(Sender: TObject);
var  DncList:TStringList;

begin
   DncList:=GetFileList('c:\123','*.*');
   DncList.Destroy;
end;


Anatoly Podgoretsky   (2005-05-21 21:20:00) [7]

И чего с каждым чихом таймера создается новый TStringList, да еще и и процедура поиска не освобождает ресурсы в системе. Тебе насколько часов ресурсов компьютера хватает? А дальше как?


Наверх

Титульная страница Поиск, карта сайта Написать письмо