![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти в 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, да еще и и процедура поиска не освобождает ресурсы в системе. Тебе насколько часов ресурсов компьютера хватает? А дальше как?