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

Вниз

Утечка памяти при использовании TStrings   Найти похожие ветки 

 
Destroyer ©   (2007-01-26 17:14) [0]

Есть код:
procedure Proc1;
var
DirList : TStrings;
FileList: TStrings;
begin
  try
   DirList := TStringList.Create;
   FileList := TStringList.Create;
   ...
   ScanFolder(DirName,FileList,DirList,...,...);
   ... // далее проводим операции с FileList,DirList
  finally
    FileList.Free;
    DirList.Free;
end;

procedure ScanFolder (const Root: TFileName;  const FileLst, DirLst:TStrings;Ext:string;Param:string);
begin
...
DirLst.Add(Root+"\"+ DirInfo.Name);
...
FileLst.Add(Root+"\"+DirInfo.Name);
...
end;


При большом количестве файлов размер программы в оперативной памяти разрастается, но не уменьшается после выполнения процедур. Видимо, что-то где-то не очищается.
В процедуре ScanFolder - FileLst и DirLst не очишаются, т.к. они являются результатом работы этой процедуры. При следующем обращении к ScanFolder FileLst и DirLst пусты, но я сомневаюсь, что они освободили занятую ранее память. Освободили или нет? Если нет, то как правильно освободить?
Также в Proc1 есть FileList и DirList, они освобождаются (.Free). Такой способ освобождает занятую ими память?


 
Сергей М. ©   (2007-01-26 17:19) [1]


> я сомневаюсь, что они освободили занятую ранее память. Освободили
> или нет?


Не сомневайся, освободили.


> размер программы в оперативной памяти разрастается


Как разрастается, так и уменьшается.

Управление оперативной памятью - привелегия ОС. Когда захочет - загрузит, когда захочет - выгрузит.


 
Сергей М. ©   (2007-01-26 17:24) [2]


>   try
>    DirList := TStringList.Create;
>    FileList := TStringList.Create;
>    ...
>    ScanFolder(DirName,FileList,DirList,...,...);
>    ... // далее проводим операции с FileList,DirList
>   finally
>     FileList.Free;
>     DirList.Free;


А вот так делают только чукчи)
Прочие жители Крайнего Севера делают иначе:

ЗанятьРесурс;
try
.. //что-то там
finally
 ОсвободитьРесурс;
end;


 
Ega23 ©   (2007-01-26 17:25) [3]

var
DirList : TStrings;
FileList: TStrings;



  DirList := TStringList.Create;
  FileList := TStringList.Create;


А так зачем? Объявляй их как TStringList

Вдогонку: создание вынеси из блока try..finally


 
Сергей М. ©   (2007-01-26 17:29) [4]


> А так зачем? Объявляй их как TStringList


Строго говоря - не обязательно. Сие зависит от частного случая - последующего обращения к методам, специфичным именно для стринглиста .. Тады приведение типа не потребуется)


 
Ega23 ©   (2007-01-26 17:41) [5]


> Строго говоря - не обязательно. Сие зависит от частного
> случая - последующего обращения к методам, специфичным именно
> для стринглиста .. Тады приведение типа не потребуется)


Это понятно. Неясно, зачем объявлять так...


 
evvcom ©   (2007-01-26 18:02) [6]

> [5] Ega23 ©   (26.01.07 17:41)
> Неясно, зачем объявлять так...

Где-то я такое уже видел. Видимо, это Copy-Paste.


 
Loginov Dmitry ©   (2007-01-26 18:34) [7]

Приведи полный текст процедуры ScanFolder(). Утечка и в ней может быть.


 
umbra ©   (2007-01-26 18:53) [8]


> Где-то я такое уже видел. Видимо, это Copy-Paste.

это из справки делфи :)


 
evvcom ©   (2007-01-26 19:03) [9]

> [8] umbra ©   (26.01.07 18:53)

Значит точно Copy-Paste :)


 
Kolan ©   (2007-01-26 21:01) [10]


> Ega23 ©   (26.01.07 17:41) [5]

Так всегда делают :)


 
Anatoly Podgoretsky ©   (2007-01-26 21:40) [11]


> Так всегда делают :)

Не всегда, иногда включают голову.


 
DVM ©   (2007-01-28 21:50) [12]


> Destroyer ©   (26.01.07 17:14)  

begin
 DirList := TStringList.Create;
 try
    FileList := TStringList.Create;
    try  
      ...
    finally
      FileList.Free;
    end;
 finally
   DirList.Free;
 end;
end;


 
Palladin ©   (2007-01-28 21:54) [13]


> [12] DVM ©

а это уже разврат


 
Amoeba ©   (2007-01-29 12:01) [14]


> Loginov Dmitry ©   (26.01.07 18:34) [7]
>
> Приведи полный текст процедуры ScanFolder(). Утечка и в
> ней может быть.
>

Факт утечки не установлен.


 
Сергей М. ©   (2007-01-29 12:42) [15]

Да и нет там, скорей всего, никакой утечки.
Обычный для BMM алгоритм.



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

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

Наверх




Память: 0.5 MB
Время: 2.059 c
2-1169815267
Ламерюга
2007-01-26 15:41
2007.02.18
Достучаться до TOpenDialog


2-1170272032
22b
2007-01-31 22:33
2007.02.18
POST на API


3-1164675408
Draught
2006-11-28 03:56
2007.02.18
Формат даты в SQL запросе


15-1169572954
Dmitry_177
2007-01-23 20:22
2007.02.18
Лицензионные Delphi и Windows


15-1170012791
Неудачнег
2007-01-28 22:33
2007.02.18
GetIfTable()