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

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

Утечка памяти при поиске файлов.


pargo ©   (2006-02-18 18:04:00) 

Здравствуйте !
Для поиска файлов использую следующую процедуру:

procedure FindMaskFilesRec(const PrimaryPath,Mask:string;List:TStrings);
var
Source:string;      
SearchRec:TSearchRec;
begin
FindFirst(PrimaryPath+'*',faAnyFile,SearchRec);
if MatchesMask(SearchRec.Name,Mask) then
 if not((SearchRec.Attr and faDirectory)=faDirectory) then
  begin
   Source:=PrimaryPath+ExtractFileName(SearchRec.Name);
   List.Add(Source);
  end;
while FindNext(SearchRec)=0 do
 if MatchesMask(SearchRec.Name,Mask) then
  if not((SearchRec.Attr and faDirectory)=faDirectory) then
   begin
    Source:=PrimaryPath+ExtractFileName(SearchRec.Name);
    List.Add(Source);
   end;
SysUtils.FindClose(SearchRec);
FindFirst(PrimaryPath+'*',faAnyFile,SearchRec);
if ((SearchRec.Attr and faDirectory)=faDirectory)
 and(SearchRec.Name<>'.')
 and(SearchRec.Name<>'..') then FindMaskFilesRec(PrimaryPath+SearchRec.Name+PathDelim,Mask,List);
while FindNext(SearchRec)=0 do
 if ((SearchRec.Attr and faDirectory)=faDirectory)
  and(SearchRec.Name<>'.')
  and(SearchRec.Name<>'..') then FindMaskFilesRec(PrimaryPath+SearchRec.Name+PathDelim,Mask,List);
SysUtils.FindClose(SearchRec);
end;


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


API   (2006-02-19 01:06:00) [1]

К слову. Я вот думаю, может, выйти с предложением выкинуть try...finally...end из языка в связи с невостребованностью?


Джо   (2006-02-19 00:13:00) [2]

> [6] pargo ©   (18.02.06 18:41)
> Все-таки интересно: что в моей не так ?

По меньшей мере, в коде одна ошибка есть: не проверяется результат вызова FindFirst. Дальше даже можно не смотреть, наверняка есть и другие погрешности. Приведи сначала код в порядок, да заодно избавься от дублирования кода.


pargo   (2006-02-18 23:59:00) [3]

Anatoly Podgoretsky ©   (18.02.06 20:21) [7]
После каждого FindFirst


Anatoly Podgoretsky   (2006-02-18 20:21:00) [4]

А где в твоей FindClose


pargo   (2006-02-18 18:41:00) [5]

Все-таки интересно: что в моей не так ?


pargo   (2006-02-18 18:30:00) [6]

Palladin ©   (18.02.06 18:17) [3]
С твоей процедурой все в полном порядке...


pargo   (2006-02-18 18:21:00) [7]

Сейчас попробую.


Palladin   (2006-02-18 18:17:00) [8]

попробуй эту

Procedure vtGetFilesList(Const p_strMask,p_strRootPath:String;p_cstrList:TStringList;p_isRecurse:Boolean=False) ;
Var
rSearch:TSearchRec;
cstrDirList:TStringList;
I:Integer;
Begin
If p_isRecurse Then cstrDirList:=TStringList.Create Else cstrDirList:=Nil;
If FindFirst(p_strRootPath+p_strMask,faAnyFile,rSearch)=0 Then
 Repeat
  If (rSearch.Name<>'.') and (rSearch.Name<>'..') Then
   If ((rSearch.Attr and faDirectory)=faDirectory) And p_isRecurse
    Then cstrDirList.Add(rSearch.Name)
    Else p_cstrList.Add(p_strRootPath+rSearch.Name)
 Until FindNext(rSearch)<>0;
FindClose(rSearch);
If p_isRecurse Then
 Begin
  For I:=0 To cstrDirList.Count-1 Do vtGetFilesList(p_strMask,p_strRootPath+cstrDirList[i]+'\',p_cstrList,True);
  cstrDirList.Free;
 End;
End;


pargo   (2006-02-18 18:13:00) [9]

Учитываю. Ставлю маску так, чтобы файлы не находились.
Все равно память растет, причем размер прироста зависит от
количества перебираемых файлов. :(((


Palladin   (2006-02-18 18:07:00) [10]

:) ну а то что List заполняется ты не учитываешь?


Наверх

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