Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

Утечка памяти в delphi   Найти похожие ветки 

 
dmitry   (2005-05-21 21:14) [0]

Привет всем! Немогу понять почему происходит утечка памяти и утечка памяти ли это вообще... Подскажите плиз...
Есть функция 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 21:20) [1]

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


 
dmitry   (2005-05-21 21:33) [2]

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

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

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


 
begin...end ©   (2005-05-21 21:44) [3]

> 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.


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

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


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

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


 
Anatoly Podgoretsky ©   (2005-05-21 22:36) [6]

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


 
Anatoly Podgoretsky ©   (2005-05-21 22:38) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2005.06.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
1-1116883613
Masta Hookah
2005-05-24 01:26
2005.06.06
On Top ->>>


14-1116234296
Ilya___
2005-05-16 13:04
2005.06.06
Господа помогите, Похоже ВИРУС!


14-1116441712
AlterEgo of WondeRu
2005-05-18 22:41
2005.06.06
Есть ли прибамбас - ТуллбарКнопка для IE


1-1116677692
scrazy
2005-05-21 16:14
2005.06.06
графическое дерево


3-1114686678
vigo
2005-04-28 15:11
2005.06.06
Вопрос по очистке БД