Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
ВнизУтечка памяти в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c